web-dev-qa-db-ja.com

NSThreadをメインスレッドに投稿する

バックグラウンドスレッドからメインスレッドにNSNotificationを投稿できる次のコードスニペットを見つけました。これが安全で受け入れ可能な方法かどうかを知りたいですか?

dispatch_async(dispatch_get_main_queue(),^{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ImageRetrieved" 
                                                        object:nil 
                                                      userInfo:imageDict];
});
58
RunLoop

はい、できます

通常、NSNotificationをmainで送信する必要があります。特に、モーダルログインダイアログを閉じるなどのUIアクティビティをトリガーする場合はそうです。

特定のスレッドへの通知の配信

通常の通知センターは、通知が投稿されたスレッドで通知を配信します。分散通知センターは、メインスレッドで通知を配信します。通知センターではなく、ユーザーが決定した特定のスレッドで通知を配信する必要がある場合があります。たとえば、ウィンドウクローズなど、バックグラウンドスレッドで実行されているオブジェクトがユーザーインターフェイスからの通知をリッスンしている場合、メインスレッドではなくバックグラウンドスレッドで通知を受信します。これらの場合、デフォルトスレッドで配信される通知をキャプチャし、適切なスレッドにリダイレクトする必要があります。

51
Anoop Vaidya

はい

これは、メインスレッドに入って通知を投稿することです。それ以上安全なものは得られません。

16
Undo

[〜#〜]はい[〜#〜]

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])
}
14
WhipsterCZ

これに沿ってどこかでこれが可能になりました:

addObserver(forName:object:queue:using:)

here ですが、全体のポイントはqueueオブジェクトです。

ブロックを追加する操作キュー。 nilを渡すと、ブロックは投稿スレッドで同期的に実行されます。

それでは、メインランループに対応するキューをどのように取得しますか?

let mainQueue = OperationQueue.main

注:これは、通知をサブスクライブするときですので、一度実行すれば完了です。すべての単一の呼び出しでそれを行うことは非常に冗長です。

6
Dan Rosenstark