を基本的な考え方は、(のために、すべての場合には、観察またはデリゲートメソッドが同じスレッドで呼び出されていることを最初の通知でありますオブザーバーパターン)または委任コードが実行されているかどうかわからない場合は、メインスレッドにUIブロックをディスパッチすることをお勧めします。私は以下の理由でこの陳述を正当化しようとします、もちろん私は間違っている可能性があります。
デリゲートプロトコルのドキュメントで明示的に指定されていない限り、デリゲートパターンでは、呼び出し元が呼び出しのときに実行しているのと同じスレッドでメソッドが直接呼び出されます。例えば。呼び出し側(委任オブジェクトは)彼のデリゲートを呼び出すために望んでおり、現在「スレッド-1」上で実行されている場合、その後の呼び出しは、同じスレッドで起こります:
// this is running in "Thread-1" --> then aDelegateMethod will continue on "Thread-1"
[myDelegate aDelegateMethod]
は限りオブザーバーパターンとして、私はしないでください主なスレッドで明示的に監視通知を送信する有効な理由を確認してください。特に、通知の元の値の変更が別のスレッドで実行されている場合は特に注意してください。実際にKVOの場合、ランタイムはクラス定義を変更して、通知を行うセッターメソッドをオーバーライドするいくつかのプライベートメソッドを追加します。この呼び出しをメインスレッドで明示的に行う有効な理由はありません。だから、私によれば、KVO通知は任意のスレッドから発生することができ、このスレッドは観測されたクラスの値の変更を実行しているスレッドと同じです。
NSNotificationCenterベースのメカニズムでは、元の通知がポストされた同じスレッドによって呼び出された通知が表示されます。これはAppleのドキュメントに明記されています(すべてのスレッドに独自の通知キューがあります)。
スレッドが維持されているので、UIブロックがメインキューで呼び出されていることを確認するには、質問に投稿したGCDコールを使用します。
またNSURLConnectionの場合、デリゲートコールバックは非同期ロード操作を開始したスレッドにありますが、これはメインスレッドである必要はありません。 – progrmr
ドキュメントがこれを明確にしたなら、UIImagePickerControllerDelegate Protocol Referenceは 'thread'という単語を使用していないこともあります。私はimagePickerController:didFinishPickingMediaWithInfo:に問題は見られませんでしたが、私は突然スレッド問題を認識しています。あなたのスナップは間違いなく私のアプリで使用する通知に役立っていました。再び、私の新しいスレッド認識は私にそれらについて不思議に思った。私は彼らがすべて正しいことを確認するためにすべてを通過する必要があります。ありがとう! – John
UIオブジェクトの場合、デリゲートは常にメインスレッド上にあると仮定できます。ドキュメントは、私が見たことがない例外があるかどうかを指定します。ここからドキュメントからこれを推測できます。 http://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-SW147 – logancautrell