UIImagePickerController
デリゲートメソッド(またはUIKit
デリゲートメソッド)がメインスレッドで呼び出されると考えました。しかしギャラリーやカメラから画像を取り出すときに、didFinishPickingMediaWithInfo
メソッドが呼び出されないようで、UIKitデリゲートメソッドをメインスレッドの右に呼び出す必要がありますか?メインスレッドの作業に明示的にディスパッチします。 Appleのドキュメントにもこれに関する記述はありません。didFinishPickingMediaWithInfoはバックグラウンドスレッドで呼び出されますか?
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString* ,id> *)info{
uploadImage = info[UIImagePickerControllerOriginalImage]; // Set selected image
dispatch_async(dispatch_get_main_queue(), ^{
[self.leftButton setImage:[UIImage imageNamed:@"image_attach.png"]
forState:UIControlStateNormal];
});
// The following does not work.
//[self.leftButton setImage:[UIImage imageNamed:@"image_attach.png"]
//forState:UIControlStateNormal];
}
ボトムライン、すべてのUIKitデリゲートメソッドは、メインスレッドで呼び出されますか?または、非メインスレッドで呼び出されるものがありますか?なぜこの矛盾は、私たちのコードをメインスレッドにディスパッチする必要はないと信じていますが、最終的にはそれが機能しますか?誰かが答えを知っていれば、明確にしてください。
EDIT:ロブによって示唆されるように 、私はコードが実行されますどのスレッドで確認するには、この方法[NSThread isMainThread]
で確認。明らかに私がメインスレッドにあることを確認するためにtrue
を返しましたが、間違いなくsetImage
メソッドをメインキューに明示的にディスパッチせずに、コードは機能しません。また、ピッカーのdismiss
メソッドの補完ハンドラにコードを移動しようとしましたが、明白なメインスレッドブロックなしで動作します。
まだ混乱し、これは次のように動作している理由について...
ここであなたを見るために良い、私は質問についてはよく分からないです ドキュメントをお読みください。https://developer.apple.com/documentation/uikit#//apple_ref/doc/uid/TP40006955-CH1-SW1 – karthikeyan
@karthikeyanグッドあなたにも会いましょう。はい、私はそれを認識しています。しかし、私は具体的には、UIKitデリゲートメソッドがメインスレッドまたはバックグラウンドスレッドで呼び出されるかどうかを知りたい。ドキュメントごとに –
あなたのアプリのメインスレッドまたはメインディスパッチキューからのUIKitクラスのみ – karthikeyan