我认为在主线程中调用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
方法的完成处理程序,瞧它没有明确的主线程块!
仍然混淆为什么这样做......
答案 0 :(得分:1)
当我测试它时,它在主线程上被调用。我建议您检查[NSThread isMainThread]
以确认(或者,在Swift中,dispatchPrecondition(condition: .onQueue(.main))
或Thread.isMainThread
)。在我的测试中,它是在主线程上。
如果它不是主线程(!),我会检查你提供它的位置,以确保你从主线程中显示它。
我无法想到在后台线程上调用的任何与UI相关的委托方法。对于非UI委托方法,有很多不使用主线程,但像这样的以UI为中心的API使用主线程。