我使用GCD使用dispatch_queueu_create
在新队列中从Internet获取一些图像。然后我返回主队列并使用UIImageView
使用提取的图像更新dispatch_async
。我使用self.imageView
来引用主队列中的UIImageView
。
但是,有时图像需要一些时间才能从Internet加载。如果用户点击某处并且视图控制器更改为其他内容,我发现一些奇怪的行为或我的应用程序甚至崩溃。我想原因是我引用了self.imageView但当前的视图控制器没有该属性。还是其他任何可能性?有什么建议可以解决这个问题吗?
提前致谢!
很抱歉,我这里没有包含代码。这是代码:
- (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);
}
答案 0 :(得分:4)
您需要取消模式。也就是说,您需要能够取消后台任务。没有代码,很难说最好的方法是什么。如果您使用更高级别的NSOperation API,则它具有取消支持。
对于Blocks / GCD,您可能希望在某个对象上有一个“isCanceled” - 最好是在代表后台获取的对象上 - 然后在可能的情况下检查是否确定响应是仍然相关。