Как -performSelector: withObject: afterDelay: работать?

В настоящее время я работаю в предположении, что -performSelector:withObject:afterDelay: не использует streamи, но планирует событие, которое должно срабатывать позднее в текущем streamе. Это верно?

Подробнее, в частности:

 - (void) methodCalledByButtonClick { for (id obj in array) { [self doSomethingWithObj:obj]; } } static BOOL isBad = NO; - (void) doSomethingWithObj:(id)obj { if (isBad) { return; } if ([obj isBad]) { isBad = YES; [self performSelector:@selector(resetIsBad) withObject:nil afterDelay:0.1]; return; } //Do something with obj } - (void) resetIsBad { isBad = NO; } 

Гарантировано ли, что -resetIsBad не будет вызываться до тех пор, пока не будет возвращен -methodCalledByButtonClick , если мы будем работать в основном streamе, даже если -methodCalledByButtonClick занимает -methodCalledByButtonClick то время?

Из документов :

Вызывает метод приемника по текущему streamу, используя режим по умолчанию после задержки.

Обсуждение идет дальше:

Этот метод устанавливает таймер для выполнения сообщения aSelector в цикле выполнения текущего streamа. Таймер настроен на запуск в режиме по умолчанию (NSDefaultRunLoopMode). Когда таймер срабатывает, stream пытается удалить сообщение из цикла запуска и выполнить селектор. Это удается, если цикл запуска запущен и находится в режиме по умолчанию; в противном случае таймер ждет, пока цикл выполнения не будет установлен в режиме по умолчанию.

Из этого мы можем ответить на ваш второй вопрос. Да, это гарантировано , даже с более короткой задержкой, так как текущий stream занят выполнением при performSelector . Когда stream вернется в цикл выполнения и удалит селектор, вы methodCalledByButtonClick из methodCalledByButtonClick .

performSelector:withObject:afterDelay: расписание таймера в том же streamе, чтобы вызвать селектор после пройденной задержки. Если вы performSelector:withObject:afterDelay:inModes: режим запуска по умолчанию (т. performSelector:withObject:afterDelay:inModes: Не используйте performSelector:withObject:afterDelay:inModes: , я уверен, что он будет ждать, пока следующий проход пройдет через цикл выполнения, поэтому все в стеке будет завершено первым.

Даже если вы вызываете с задержкой 0, он будет ждать следующего цикла и будет вести себя так, как вам нужно. Для получения дополнительной информации обратитесь к документам .

  • Простое обнаружение движения iPhone
  • Как использовать NSTimer?
  • Сортировка NSArray строк или объектов даты
  • Open Source Cocoa / Cocoa-Touch POP3 / SMTP библиотека?
  • как зарегистрировать приложение, чтобы открыть файл pdf в моем приложении в ipad
  • Создание пользовательского UIKeyBoard для iPhone
  • как увеличить размер шрифта в UIWebView
  • Воспроизведение музыки в фоновом режиме с помощью AVAudioplayer
  • Что такое NSCFDictionary?
  • как создать круглую кнопку?
  • iOS 5: Интересно о UIAppearance
  • Давайте будем гением компьютера.