Это не только центр уведомлений.
У меня есть класс, содержащий метод с петлей. Мне нужно разбить цикл, если произойдет определенное событие (например, нажатие кнопки).
События для этого нажатия кнопки входят в основную резьбу. Если ваш цикл работает в основном потоке, тогда кнопка сама нажимает не обрабатывается до завершения цикла. Уведомление публикуется немедленно, относительно нажатия кнопки, фактически обрабатываемой вашим приложением.
Или, в виде списка:
- Пользователь нажимает на кнопку.
- Ваша петля исходит из вещей, которые нужно делать и возвращается.
- Нажатие кнопки приходит в ваше приложение и включается кнопкой в сообщение о действии.
- Вы публикуете уведомление.
- Вы получаете уведомление.
Задержка, которую вы видите, находится между этапами 1 и 2; шаг 4 происходит сразу же после шага 3.
Уведомления о локальном (нераспределенном) NSNotificationCenter отправляются в поток, из которого вы их отправили, поэтому отправка его из вашего метода действий означает, что он будет отправлен в основной поток. Это нормально и нормально.
Переместите петлю , а не уведомление, в фоновый поток, очередь отправки или операционную очередь. Если вы используете очередь операций, вам может не понадобиться уведомление вообще, так как вы можете указать очередь операций для отмены всех ожидающих операций. (Ваши операции должны будут проверяться в любое подходящее время, если они были отменены, для reasons previously discussed убийство потока/операции в случайное время - это плохая идея.)
Фоновые потоки, блоки и операции могут при необходимости связывается с основным потоком (например, для обновления пользовательского интерфейса). Чтобы отправить сообщение через цикл запуска основного потока, используйте performSelectorOnMainThread:withObject:waitUntilDone:
. Чтобы отправить блок на основную резьбу, используйте dispatch_async
и dispatch_get_main_queue
. Чтобы запланировать операцию над основным потоком, добавьте ее в [NSOperationQueue mainQueue]
.
Для получения дополнительной информации прочитайте Concurrency Programming Guide и Notification Programming Topics.
Петля обновляет пользовательский интерфейс, поэтому он должен оставаться в основном потоке – John