gpt4 book ai didi

ios - didFinishPickingMediaWithInfo 是否在后台线程中被调用?

转载 作者:行者123 更新时间:2023-11-29 11:41:13 27 4
gpt4 key购买 nike

我认为 UIImagePickerController 委托(delegate)方法(或任何 UIKit 委托(delegate)方法)在主线程中被调用。但是在这里,当从图库或相机中选取图像时,didFinishPickingMediaWithInfo 方法似乎并没有被调用,UIKit 委托(delegate)方法必须在主线程上调用,对吗?显式分派(dispatch)到主线程工作。 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 委托(delegate)方法都在主线程上调用?或者一些在非主线程中被调用?为什么我们认为没有必要将我们的代码分派(dispatch)到主线程,但最终这样做会使事情正常进行,为什么会出现这种不一致?如果有人知道答案,请澄清。

编辑:正如 Rob 所建议的,我检查了此方法 [NSThread isMainThread] 以查看代码在哪个线程中执行。它显然返回了 true 以确认我在主线程中,但奇怪的是没有将我的 setImage 方法显式分派(dispatch)到主队列,代码不起作用。此外,我尝试将我的代码移动到选择器的 dismiss 方法的完成处理程序,瞧,它在没有显式主线程 block 的情况下工作!

仍然对为什么会这样表现感到困惑......

最佳答案

我测试的时候是在主线程调用的。我建议检查 [NSThread isMainThread] 以确认(或者,在 Swift 中,dispatchPrecondition(condition: .onQueue(.main))Thread.isMainThread)。在我的测试中,它在主线程上。

如果它不是主线程 (!),我会检查你在哪里展示它,以确保你是从主线程展示它的。

我想不出任何在后台线程上调用的与 UI 相关的委托(delegate)方法。对于非 UI 委托(delegate)方法,有很多不使用主线程,但像这样以 UI 为中心的 API 使用主线程。

关于ios - didFinishPickingMediaWithInfo 是否在后台线程中被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46466466/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com