Центр уведомлений прослушивает в очереди

#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 Указание приведет к небольшой задержке в руке,в уведомлении. Это может иметь или не иметь значения для вас