Как -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, он будет ждать следующего цикла и будет вести себя так, как вам нужно. Для получения дополнительной информации обратитесь к документам .

  • NSDictionary с упорядоченными ключами
  • Неверное завершение кода Xcode 6 не работает
  • Преобразование NSArray в NSDictionary
  • Класс Foo реализован как в MyApp, так и в MyAppTestCase. Один из двух будет использован. Какой из них не определен
  • Запустите NSRunLoop в командной строке программы Cocoa
  • UIImage от CALayer - iPhone SDK
  • Получение списка файлов в каталоге с глобусом
  • К ARC или не к ARC? Каковы плюсы и минусы?
  • SEL выполняет выбор и аргументы
  • Как сделать кнопку перехвата надписью для перехвата событий?
  • Почему автореферат особенно опасен / дорого для приложений iPhone?
  • Interesting Posts

    Обнаружить конец ScrollView

    Codeigniter REST CSV импорт в mysql

    Как работает Bittorrent?

    Пост-инкремент и предварительный инкремент в цикле «for» производят одинаковый вывод

    Как использовать параметры в VBA в разных контекстах Microsoft Access?

    Как решить проблему 32-байтового выравнивания для операций загрузки / хранения AVX?

    прекратить навигацию по угловому ui-маршрутизатору до тех пор, пока не будет разрешено promise

    Заменить символы с помощью gsub, как создать функцию?

    Пейджинг UIScrollView с шагом меньше размера кадра

    Как использовать переменные оболочки в командной строке perl в сценарии оболочки bash?

    Откройте URL-адрес из Windows Forms

    Как работает пропускная способность USB? Будет ли несколько устройств разделять ограничение 480 Мбит / с для USB 2.0?

    Как получить доступную память C ++ / g ++?

    Где я могу найти «терминальную» программу на OS X?

    Просмотр с горизонтальным и вертикальным панорамированием / drag and dropм и усилением

    Давайте будем гением компьютера.