gpt4 book ai didi

iphone - 使用 GCD 进行 iOS 编程

转载 作者:行者123 更新时间:2023-12-01 18:31:31 25 4
gpt4 key购买 nike

我使用 GCD 在新队列中使用 dispatch_queueu_create 从 Internet 获取一些图像.然后我回到主队列并更新 UIImageView使用获取的图像 dispatch_async .我正在使用 self.imageView引用 UIImageView在主队列中。

但是,有时图像需要一些时间才能从 Internet 加载。如果用户单击某处并且 View Controller 更改为其他内容,我会发现一些奇怪的行为或者我的应用程序甚至崩溃。我猜原因是我引用了 self.imageView 但当前 View Controller 没有该属性。或者还有其他可能吗?有什么建议可以解决这个问题吗?

提前致谢!

对不起,我没有在这里包含代码。这是代码:

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];

dispatch_queue_t photoFetchQueue = dispatch_queue_create("photo data downloader", NULL);
dispatch_async(photoFetchQueue, ^{
NSURL *photoURL = ...;
NSData *photoData = ...;
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = [UIImage imageWithData:photoData];
self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);
self.scrollView.zoomScale = 1.0;
self.scrollView.contentSize = self.imageView.image.size;
[scrollView zoomToRect:imageView.frame animated:YES];
});
});
dispatch_release(photoFetchQueue);
}

最佳答案

你需要一个取消模式。也就是说,您需要能够取消后台任务。没有代码,很难说最好的方法是什么。如果您使用更高级别的 NSOperation API,它具有取消支持。

对于 Blocks/GCD,您可能希望在某处的某个对象上有一个“isCanceled”——最好是在代表后台提取的对象上——然后在可能的情况下检查它以确定响应是否仍然相关。

关于iphone - 使用 GCD 进行 iOS 编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8391811/

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