【发布时间】:2017-09-28 10:07:10
【问题描述】:
我认为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 方法的完成处理程序,瞧,它可以在没有显式主线程块的情况下工作!
仍然对为什么会有这样的行为感到困惑......
【问题讨论】:
-
很高兴在这里见到你,我不确定问题阅读文档:developer.apple.com/documentation/uikit#//apple_ref/doc/uid/…
-
@karthikeyan 也很高兴见到你。是的,我知道这一点。但我想具体了解 UIKit 委托方法是在主线程还是后台线程中调用。
-
根据文档 UIKit 类仅来自您应用的主线程或主调度队列
-
@karthikeyan 它只在主线程中被调用。但不知何故,该代码仅适用于
dispatch_async块。 -
顺便问一下,你为什么要在 imagepicker 委托中设置按钮图像
标签: ios uikit uiimagepickercontroller grand-central-dispatch ios-multithreading