gpt4 book ai didi

ios - 在 iOS 中使用线程返回图像

转载 作者:行者123 更新时间:2023-11-29 11:14:30 25 4
gpt4 key购买 nike

大家好,我正在学习斯坦福 iOS 开发类(class)。我有一个关于线程的问题。我知道 UIKit 调用应该由主线程处理。我想知道这样的事情是否合法?

- (UIImage *)mapViewController:(MapViewController *)sender imageForAnnotation:(id<MKAnnotation>)annotation {
FlickrPhotoAnnotation *fpa = (FlickrPhotoAnnotation *) annotation;
NSURL *url = [FlickrFetcher urlForPhoto:fpa.photo format:FlickrPhotoFormatSquare];

__block UIImage *image;
dispatch_queue_t downloadQ = dispatch_queue_create("download queue", NULL);
dispatch_async(downloadQ, ^{
NSData *data = [NSData dataWithContentsOfURL:url];
if (data) {
dispatch_async(dispatch_get_main_queue(), ^{
image = [UIImage imageWithData:data];
});
}
});
dispatch_release(downloadQ);
return image;
}

或者我应该只返回 NSData 并处理调用方法中的所有线程?

谢谢

最佳答案

您的代码不会执行您想要的操作。

您正在将一个异步 block 放入队列中,然后立即从方法中返回。您不能保证该 block 会在您返回之前实际运行——事实上,它不会运行的可能性很大。

因此您将返回image 的当前值。因为你没有初始化它,它可能是垃圾。调用此方法的人将尝试使用指向图像的垃圾指针,并且(如果幸运的话)崩溃。如果您已将其初始化为 nil:

__block UIImage *image = nil;

这样会更礼貌一些。

这里的问题是:您的方法必须返回一个 UIImage,因此您必须等待完成构建的 UIImage 之后再返回。在其他线程上执行此操作的好处为零——您仍在等待相同的时间,切换线程只会增加开销。

为了以有用的异步方式加载图像,您需要某种方式通过对委托(delegate)方法或 block 的回调,在图像加载完成时异步通知调用者。例如,查看 Foundation 中的 NSURLConnection。它有一个通过委托(delegate)回调的旧方法,以及一个通过 block 回调的新方法 (+sendAsynchronousRequest:queue:completionHandler:)。

关于ios - 在 iOS 中使用线程返回图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10068656/

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