NSData 结果导致 NSTimer 延迟

时间:2021-04-21 18:56:38

标签: ios objective-c xcode nstimer nsdata

我有一个 NSTimer,它应该在 10 秒后触发它的选择器。但是由于 NSData 结果的延迟,计时器也会延迟,并且在执行 NSData 操作后触发其选择器。

        NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:10.0
                                         target:self
                                       selector:@selector(fireTimer)
                                       userInfo:nil
                                        repeats:NO];
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:decryptedPath]];
        _audioPlayer = [[AVAudioPlayer alloc] initWithData:data error:nil];

在上面的代码中,Timer 等待 NSData 结果然后触发它的选择器。

1 个答案:

答案 0 :(得分:2)

这是因为 #include <iostream> #include <stdlib.h> #include <conio.h> #include <time.h> using namespace std; int righe_mat, colonne_mat, n_mine, minimo, massimo, massimo_c; void InsMine(int mat[32][18]); void RiempiMat(int mat[32][18]); void StampaMat(int mat[32][18]); int main() { int scelta; int PosNum[32][18], Scoperte[32][18]; do{ //scelta difficoltà da parte dell'utente cout << "Scegliere il livello di difficolta' (1=facile, 2=medio, 3=difficile): "; cin >> scelta; switch(scelta){ //modifica variabili globali in base alla difficoltà scelta case 1: righe_mat=11; colonne_mat=11; n_mine=10; minimo=1; massimo=9; massimo_c=9; break; case 2: righe_mat=18; colonne_mat=18; n_mine=40; minimo=1; massimo=16; massimo_c=16; break; case 3: righe_mat=32; colonne_mat=18; n_mine=99; minimo=1; massimo=30; massimo_c=16; break; default: cout << "Scelta non valida, ripetere selezione" << endl; } } while(scelta!=1&&scelta!=2&&scelta!=3); RiempiMat(PosNum); RiempiMat(Scoperte); InsMine(PosNum); cout << endl << endl; StampaMat(PosNum); } void RiempiMat(int mat[32][18]){ int i, j, k, o, m, n; for(i=0;i<colonne_mat;i++){ mat[0][i]=-1; } for(j=0;j<colonne_mat;j++){ mat[righe_mat-1][j]=-1; } for(k=0;k<righe_mat;k++){ mat[k][0]=-1; } for(o=0;o<righe_mat;o++){ mat[o][colonne_mat-1]=-1; } for(m=1;m<colonne_mat-1;m++){ for(n=1;n<righe_mat-1;n++){ mat[n][m]=0; } } } void InsMine(int mat[32][18]){ int i, r, c, j, k, contatore; for(i=0;i<n_mine;i++){ do{ srand(time(NULL)); r=minimo + rand() % massimo-1; c=minimo + rand() % massimo_c-1; } while(mat[r][c]==-2||mat[r][c]==-1); mat[r][c]=-2; } for(j=1;j<=massimo;j++){ //for che scorre la matrice (colonne) for(k=1;k<=massimo_c;k++){ //for che scorre la matrice (righe) contatore=0; if(mat[j][k]!=-2){ if(mat[j-1][k]==-2){ contatore++; } if(mat[j-1][k+1]==-2){ contatore++; } if(mat[j][k+1]==-2){ contatore++; } if(mat[j+1][k+1]==-2){ contatore++; } if(mat[j+1][k]==-2){ contatore++; } if(mat[j+1][k-1]==-2){ contatore++; } if(mat[j+1][k-1]==-2){ contatore++; } if(mat[j-1][k-1]==-2){ contatore++; } mat[j][k]=contatore; } } } } void StampaMat(int mat[32][18]){ int i, j; for(i=0;i<colonne_mat;i++){ for(j=0;j<righe_mat;j++){ cout << mat[j][i] << " |"; } cout << endl; } cout << endl << endl << endl; } 阻塞了主队列(定时器触发的地方)。你永远不应该那样做。你需要先使用 NSURLSession 下载它,一旦它完成,然后将数据传递给 AVAudioPlayer。 AVAudioPlayer 不是为流式传输而设计的。

相关问题