バックグラウンドスレッドからメインスレッドにNSNotification
を投稿できる次のコードスニペットを見つけました。これが安全で受け入れ可能な方法かどうかを知りたいですか?
dispatch_async(dispatch_get_main_queue(),^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"ImageRetrieved"
object:nil
userInfo:imageDict];
});
はい、できます。
通常、NSNotificationをmainで送信する必要があります。特に、モーダルログインダイアログを閉じるなどのUIアクティビティをトリガーする場合はそうです。
通常の通知センターは、通知が投稿されたスレッドで通知を配信します。分散通知センターは、メインスレッドで通知を配信します。通知センターではなく、ユーザーが決定した特定のスレッドで通知を配信する必要がある場合があります。たとえば、ウィンドウクローズなど、バックグラウンドスレッドで実行されているオブジェクトがユーザーインターフェイスからの通知をリッスンしている場合、メインスレッドではなくバックグラウンドスレッドで通知を受信します。これらの場合、デフォルトスレッドで配信される通知をキャプチャし、適切なスレッドにリダイレクトする必要があります。
これは、メインスレッドに入って通知を投稿することです。それ以上安全なものは得られません。
[〜#〜]はい[〜#〜]
Swift 2構文
dispatch_async(dispatch_get_main_queue()) {
NSNotificationCenter.defaultCenter().postNotificationName("updateSpinner", object: nil, userInfo: ["percent":15])
}
Swift構文
DispatchQueue.main.async {
NotificationCenter.default.post(name: "updateSpinner", object: nil, userInfo: ["percent":15])
}
これに沿ってどこかでこれが可能になりました:
addObserver(forName:object:queue:using:)
here ですが、全体のポイントはqueue
オブジェクトです。
ブロックを追加する操作キュー。
nil
を渡すと、ブロックは投稿スレッドで同期的に実行されます。
それでは、メインランループに対応するキューをどのように取得しますか?
let mainQueue = OperationQueue.main
注:これは、通知をサブスクライブするときですので、一度実行すれば完了です。すべての単一の呼び出しでそれを行うことは非常に冗長です。