Как разбудить спящую нить в макинтоше - PullRequest
0 голосов
/ 01 марта 2012

Я новичок в Objective C. Я усыпляю поток, используя

[NSThread sleepForTimeInterval:10.0f];

, но когда происходят определенные события, я хочу разбудить этот спящий поток.Как мне разбудить эту спящую тему?

Спасибо

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Этого нельзя сделать. Если поток спит с использованием этого метода, его нельзя разбудить, пока не истечет время.

Нечто подобное можно эмулировать с помощью объекта NSCondition.

0 голосов
/ 14 августа 2015

Я бы предложил использовать NSTimer вместо использования NSThread, в основном из-за ограничений контроля выполнения спящего потока.NSTimer позволяет немедленную отмену посредством вызова на invalidate, который может быть вызван в ответ на некоторую отмену пользователя.NSTimer обеспечивает два типа стрельбы: повторяющийся и неповторяющийся.Приведенный ниже код использует NSTimer для повторных вызовов указанного селектора:

//delayInSeconds and intervalInSeconds are NSTimeInterval values calclulated elsewhere
NSDate *fireDate = [[NSDate date] dateByAddingTimeInterval:delayInSeconds];

//Create a timer that will repeat, starting with the fireDate
//Optionally, userInfo could contain an object. checkSomething:
//  would take one parameter, the NSTimer which would carry the userInfo
//timer is a strong property defined for a particular class, as an instance variable.
self.timer = [[NSTimer alloc] initWithFireDate:fireDate
                                      interval:intervalInSeconds
                                        target:self
                                      selector:@selector(checkSomething:)
                                      userInfo:nil
                                       repeats:TRUE];

//Launch the timer on the main run loop
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

Ограничения на спящий NSThread

Один явный недостаток спящего потокав том, что пробуждение - это такое нетрадиционное решение (включающее использование сигнала для прекращения процесса), что один из оставшихся вариантов - использовать флаг.Это проблема, потому что будет значительное время для сна.Например, если время ожидания составляет 10 секунд, то перед считыванием флага может возникнуть задержка в 10 секунд, и приложение ответит.

Поскольку sleepForTimeInterval является методом класса, онневозможно вызвать cancel в спящем потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...