我使用GCD在使用dispatch_queueu_create
的新队列中从互联网获取一些图像。然后,我回到主队列,并使用dispatch_async
用获取的图像更新UIImageView
。我使用self.imageView
来引用主队列中的UIImageView
。
然而,有时图像需要一些时间才能从互联网上加载。如果用户点击某个地方,视图控制器改变到别的地方,我就会发现一些奇怪的行为,甚至我的应用会崩溃。我想原因是我指的是自我。但当前视图控制器没有这个属性。或者还有其他可能性吗?有什么建议吗?
提前感谢!
对不起,我没有在这里包含代码。下面是代码:
- (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"——最好是在代表后台取回的对象上——然后在可能的情况下检查它,以确定响应是否仍然相关。