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