2016-12-10 7 views
0

通知ターゲットをバックグラウンドスレッドで起動させようとしています。ドキュメントは、ターゲットが通知がエンキューされたトレッド上で呼び出されることを主張しています。IOS、DisplaceQueue.globalでラップされたNotificationQueueコールが起動しない

バックグラウンドで実行される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


長いバージョンが必要です通知がエンキューされました。

これは完全に真実ではありません。可能キューに置か掲載時に通知センターに通知を配布し

のに対し、通知:documentationNotification Center秒間ではなくNotificationQueue

ここ

NotificationQueue documentationはそれについて言っている何のためにこの事実をアサートは、現在の実行ループを通過するまで、または実行ループがアイドルになるまでになります。

次にあなたがenqueue関数の4番目のパラメータを持っている:

モード:通知に モードのリストを掲示することができる場合は、通知キューは唯一の通知センターに通知を掲載します。実行ループはアレイに設けられたモードの1つにある。 nilでもかまいません。デフォルトではNSDefaultRunLoopModeになります。

は誰かが明示的にそれらのいずれかを実行しない限り、GCDは文句を言わない、グローバル同時キュー、に実行ループを作成し、その後、我々は、通知キューが発生しませんこの動作を持っているという事実と、このすべてを組み合わせます。

関連する問題