Использование [[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]], чтобы запустить запланированные селекторы

В моем приложении в какой-то момент у меня есть куча сообщений, запланированных с использованием performSelector.

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

Я мог бы поместить свой код в другой метод и запланировать его, используя performSelector:target:argument:order:modes: со значением order, достаточно высоким, чтобы быть уверенным, что он сработает последним, но есть причины, по которым я думаю, что это будет уродливое решение.

Итак, я отправляю [[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]], и, похоже, он работает именно так, как мне нужно.

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


person zrslv    schedule 29.04.2012    source источник


Ответы (1)


Хорошо, отвечая на мой собственный вопрос.

Прежде всего, это дубликат (также это).

Далее, как правило, отправка [[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]] из того же цикла выполнения — плохая идея:

  1. Теоретически пул авторелиза будет истощен таким образом. На практике мне не удалось вызвать сбой приложения, используя объекты, выделенные pre-runUntilDate (под ARC), но все равно лучше не рисковать.

  2. Если каким-то образом другое действие будет удалено из очереди во время этого runUntilDate, это может вызвать некоторые неожиданные побочные эффекты.

TL;DR Я должен сделать себе одолжение и заменить этот фрагмент кода чем-то более детерминированным.

person zrslv    schedule 29.04.2012