#ios #swift #queue #observers #notificationcenter
Вопрос:
Я хочу знать разницу между
NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: nil) { _ in
...
}
против
NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: .main) { _ in
...
}
От Apple:
очередь Очередь операций, в которой выполняется блок. Когда значение равно нулю, блок выполняется синхронно в потоке публикации.
Итак, как я понимаю , если я отправлю .main
, блок будет иметь больший приоритет для запуска? Я просто хочу обязательно зарегистрироваться, когда приложение перейдет в фоновый режим. Есть ли какая-либо причина или ситуация, по которой ни один блок не будет вызван?
Комментарии:
1. В общем, я бы не стал предполагать, что
.main
это будет иметь лучшую производительность для наблюдателей. Если вы отправляете сообщение из какого-либо фонового потока, синхронная обработка его в текущем потоке, скорее всего, будет более производительной, хотя вряд ли это будет заметно. Я бы не стал беспокоиться об этой проблеме с производительностью, так как она, скорее всего, несущественна: реальный вопрос в том, заботитесь ли вы о том, в каком потоке выполняется закрытие (т. Е. Выполняет ли оно что-то, требующее основного потока или некоторой синхронизации, например). Если это так, укажите соответствующую очередь при настройке наблюдателя. Если нет,nil
то, вероятно, лучше оставить его.2. Если вам нужно выполнить какую-либо задачу, связанную с пользовательским интерфейсом, вы должны убедиться, что блок будет выполняться в основном потоке, либо указав основную очередь, если код отправки уведомлений не выполняется в основном потоке, либо убедившись, что код отправки уведомлений находится в основном потоке.
3. Я хочу только зарегистрировать в UserDefaults флаг независимо от того, переходит приложение в фоновый режим или нет, у меня есть тот же код, но для
UIApplication.didBecomeActiveNotification
обновления этого флага. Причина этого в том, чтобы проверить OOM при следующем запуске приложения, если это был БУМ (фон из памяти), мы проверяем другие вещи.4. Я бы не подумал, что
.main
это «придаст ему больший приоритет». Есть большая вероятность, что.didEnterBackground
уведомление уже было размещено в основной очереди. Если вы явно укажете.main
, то ваш обработчик уведомлений будет асинхронно запланирован в основной очереди, тогда как если вы укажете.nil
, что ваш обработчик вызывается синхронно в любой очереди, из которой он был отправлен (вероятно, в основной очереди)..main
Указание приведет к небольшой задержке в руке,в уведомлении. Это может иметь или не иметь значения для вас