Я бы предложил использовать 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
в спящем потоке.