Вы спите основной поток, который, я уверен, не очень хорошая идея. Я предлагаю, чтобы способ Какао сделать то, что вы хотите, это использовать таймер. Вместо вашего кода выше:
[NSTimer scheduledTimerWithTimeInterval:3.0
target:self
selector:@selector(showNextShot:)
userInfo:nil
repeats:YES];
(Параметр userInfo
позволяет передавать произвольный объект, который вы хотите использовать при срабатывании таймера, поэтому вы можете использовать его для отслеживания текущего индекса как номера NSN, но это должно быть обернут в объект изменяемого контейнера, потому что вы не можете установить его позже.)
Затем поместите код из вашего блока в метод, вызываемый таймером. Вам нужно будет создать переменную экземпляра для текущего индекса.
- (void)showNextShot:(NSTimer *)timer {
if( currentShotIdx >= [newShots count] ){
[timer invalidate]; // Stop the timer
return; // Also call another cleanup method if needed
}
NSDictionary * obj = [newShots objectAtIndex:currentShotIdx];
// Your code...
currentShotIdx++;
}
Чтобы избежать начальной 3-секундной задержки, вызванной использованием таймера, вы можете вызвать тот же метод, который использует ваш таймер, прямо перед его настройкой:
[self showNextShot:nil]
[NSTimer scheduled...
Или может также запланировать запуск неповторяющегося таймера как можно скорее (если вы действительно хотите использовать userInfo
):
[NSTimer scheduledTimerWithTimeInterval:0.0
...
repeats:NO];
РЕДАКТИРОВАТЬ : Я забыл о -initWithFireDate:interval:target:selector:userInfo:repeats:
!
NSTimer *tim = [[NSTimer alloc] initWithFireDate:[NSDate date]
interval:3.0
target:self
selector:@selector(showNextShot:)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:tim
forMode:NSDefaultRunLoopMode];
[tim release];