我认为UIImagePickerController
委托方法(或任何UIKit
委托方法)在主线程中被调用。但是在这里,当从画廊或相机中选择图像时,该didFinishPickingMediaWithInfo
方法似乎没有被调用,并且 UIKit 委托方法必须在主线程上调用对吗?显式调度到主线程有效。Apple 文档中也没有提及这一点。
-(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 委托方法都在主线程上调用吗?或者有些在非主线程中被调用?为什么我们认为没有必要将我们的代码分派到主线程,但最终这样做会使事情发生这种不一致?如果有人知道答案,请澄清。
编辑:
正如 Rob 所建议的,我用这个方法检查[NSThread isMainThread]
了代码在哪个线程中执行。它清楚地返回true
确认我在主线程中,但奇怪的是没有setImage
明确地将我的方法分派到主队列,代码不起作用。此外,我尝试将我的代码移动到选择器dismiss
方法的完成处理程序,瞧,它可以在没有显式主线程块的情况下工作!
仍然对为什么会这样表现感到困惑......