3

У меня NSOperationQueue, который работает в другом потоке, чем все приложение. Я добавляю NSOperation в очередь, что в основном естьNSOperation с циклом NSTimer, как остановить его

-(void)main{ 
    [self updatePallets]; 
    NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval: 5.0 target:self selector: @selector(updatePallets) userInfo: nil repeats: Yes]; 
    NSRunLoop * runLoop = [NSRunLoop currentRunLoop]; 
    [runLoop addTimer:timer forMode: NSRunLoopCommonModes]; 
    [runLoop run]; 
} 

И он отлично работает, как я и хотел. Но как отменить этот тип операции. На Моей главной теме я хочу, например, сделать что-то вроде этого:

[queue cancelAllOperations]; 
[queue waitUntilAllOperationsAreFinished]; 

И я хочу, чтобы повесить основной поток и подождать, пока она не будет закончена. Затем выполните некоторые действия. Но он не отменяет никакой операции (есть только один с таймером), что я должен делать? Я также попытался добавить новую операцию в очередь после посыльного диспетчера, но все равно не могу ее остановить.

+0

Вы сделали недействительным таймер? '[timer invalidate]' – anhtu

+0

Нет. Я просто попытался отменить операцию. Поэтому мне нужно иметь ссылку на таймер ... Возможно ли отменить все операции, а затем остановить все операции? Могу ли я добавить некоторые условия для runLoop? –

+0

Я не уверен насчет отменыAllOperations. Но с NSTimer я использую '[timer invalidate]' – anhtu

ответ

1

я нашел что-то вроде:

вручную удалить все известные источники входного сигнала и таймеры из цикла выполнения не является гарантией того, что цикл запуска будет выхода. OS X может устанавливать и удалять дополнительные источники входных данных по мере необходимости для обработки запросов, направленных на поток получателя. Поэтому эти источники могут помешать запуску цикла.

Если вы хотите, чтобы цикл цикла завершился, вы не должны использовать этот метод. Вместо этого используйте один из других методов запуска, а также проверьте другие произвольные условия в цикле.

Таким образом, я добавил while цикл. Но я не знаю, эффективен ли он ...

while(self.timer.valid && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]);