Intereting Posts
Импортировать CocoaPods (Swift) в XCode Poject AVAudioPlayer возвращает нуль после игры некоторое время Значение, которое не передается, отображается как (null) в контроллере представления назначения ExecutionEngineException: попытка JIT-метода компиляции 'System.Collections.Generic.Dictionary' Ячейка в UITableView не обновляется до тех пор, пока не будет выбран в iOS (быстрый) Как отключить блики / сияние для значка iOS с помощью Forge? Получать пользовательские ограничения вида от контроллера представления как я могу читать новые вставленные данные из FMDatabase Пользовательская анимация контроллера навигации iOS: это неправильно? Неверные объявления Как автоматизировать выбор даты из UIDatePicker с использованием KIF Framework Добавление Firebase SDK каким-то образом нарушает вход в facebook без видимой причины Основные данные IOS с KVO – valueForKey: для настраиваемого свойства в подклассе NSManagedObject? Ограничение UITextView на одну строку Геолокация при отключенном приложении iOS

Недействительность NSTimer из метода его вызова

Я запланировал таймер, используя [NSTimer scheduleTimerWithTimeInterval: target: selector: userInfo:] и хочу сделать недействительным его в какой-то момент, когда он срабатывает.

- (id)init { [NSTimer scheduledTimerWithInterval:1 target:self selector:@selector(fired:) userInfo:nil repeats:YES]; } - (void)fired:(NSTimer *)timer { if (someCondition) { [timer invalidate]; } } 

Это разрешено? В документации указано

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

Если это не является правильным способом для выполнения этой задачи: каков правильный путь?

Это прекрасно, чтобы аннулировать его из уволенного метода, поскольку запущенный метод находится в том же потоке, на который был запланирован таймер:

scheduledTimerWithTimeInterval: мишень: селектор: UserInfo: повторы:

Создает и возвращает новый объект NSTimer и планирует его в текущем цикле выполнения в режиме по умолчанию.

Вызов [timer invalidate] из метода пожара просто прекрасен, этот код будет выполнен в том же потоке, что и при создании таймера.

Указанный вами Apple Doc предупреждает только о том, что если вы создадите отдельный поток и отмените от него таймер, тогда и только тогда следует ожидать непредсказуемого поведения.

Ex.

 // Create the background queue dispatch_queue_t queue = dispatch_queue_create("do not do this", NULL); // Start work in new thread dispatch_async(queue, ^ { // !! do not do this !! if (someCondition) { [yourTimer invalidate]; } // or this [self fire:yourTimer]; }); // won't actually go away until queue is empty dispatch_release(queue);