我有一个 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 结果然后触发它的选择器。
答案 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 不是为流式传输而设计的。