2016-12-10 5 views
0

Я пытаюсь запустить мои целевые объекты уведомлений в фоновом потоке. В документации утверждается, что цели будут вызываться на протекторах, где уведомление было помещено в очередь.IOS, вызов NotificationQueue, завернутый в DisplaceQueue.global, не срабатывает

Если я завержу enqueuing внутри DispatchQueue, который работает в фоновом режиме, цель никогда не вызывается. Если я удалю DispatchQueue, тогда цели будут вызваны, конечно же, в основном потоке.

for aLocation in locations { 
      // add it to the queue 
      DispatchQueue.global(qos: DispatchQoS.QoSClass.background).async { 
       let notify = Notification(name: MyLocationManager.queueName(), object:aLocation) 
       NotificationQueue.default.enqueue(notify, 
             postingStyle: NotificationQueue.PostingStyle.asap, 
             coalesceMask:NotificationQueue.NotificationCoalescing(rawValue: 0), 
             forModes: nil) 
      } 
     } 

ответ

0

Короткий ответ был бы: NotificationQueue s нужен run loop


Длинная версия:

документация утверждает, что цели будут ссылаться на протекторе где уведомление было закрыто.

Это не совсем так. documentation утверждает, этот факт только для Notification Center с, но не для NotificationQueue сек

Вот что NotificationQueue documentation должен сказать об этом:

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

Тогда у вас есть 4-й параметр в enqueue функция в:

режимы:. Список режимов уведомления могут быть размещены в очереди уведомления только отправлять уведомления его уведомления центра, если цикл цикла находится в одном из режимов, предоставляемых в массиве. Может быть nil, и в этом случае по умолчанию используется NSDefaultRunLoopMode.

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