我有一个UIImageView。此imageView的图像是从网络加载的。有人可以告诉我如何停止加载?
这是我的代码:
UIImageView *currentImgView = (UIImageView *)[self.scrollView viewWithTag:self.pageControl.currentPage + 500];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIImage *newImg = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[[[self.imagesStructure valueForKey:DATA_PARAMETER] objectAtIndex:self.pageControl.currentPage] valueForKey:@"source"]]]];
dispatch_async(dispatch_get_main_queue(), ^{
currentImgView.image = newImg;
[self hideActivityView];
});
});
答案 0 :(得分:3)
您无法使用dataWithContentsOfURL:
执行此操作。您需要切换为使用NSURLConnection
而不是dispatch_async
下载数据。然后,您可以致电[connection cancel]
停止下载。有关设置此内容的详细信息,请参阅URL Loading System。
请注意,在大多数情况下,除非文件非常大,否则取消下载并不值得。当你已经取消时,数据通常已经在飞行中,你也可以把它扔掉,而不是试图取消(因为你无论如何都会得到它)。
要实施此方法,您需要在currentImgView.image = newImg
行之前检查取消。您通常应该这样做(因为在下载它和主队列再次运行的时间之间可能会取消下载)。解决此问题的一个好方法是使用NSOperaration
,因为它可以让您访问方便的cancel
方法。请注意,取消操作只会设置一个标志。由你来检查那个标志并停止处理。
答案 1 :(得分:0)
我们可以引导您完成如何创建可取消的网络请求(例如基于NSURLConnectionDataDelegate
的请求),理想情况下将其包含在基于NSOperation
的实现而不是GCD中,以促进取消过程(以及控制并发度)。但是那里有很多工作和特殊的考虑因素,我不确定我是否会建议走这条路。
使用其中一个UIImageView
类别要容易得多(SDWebImage很棒,AFNetworking可以)。如果您使用其中一个UIImageView
类别,则会变得如此简单:
[currentImgView setImageWithURL:url];
这不仅会异步加载图像,而且当您删除图像视图(或请求其他图像)时,它将取消先前的网络请求。或者您可以明确取消它(cancelCurrentImageLoad
使用SDWebImage; cancelImageRequestOperation
使用AFNetworking)。它还会缓存响应(因此,如果您回到同一图像5次,它只需要从网络请求一次)。
如果你真的想“自己动手”,你可以这样做(我们可以指出你正确的方向),但如果你只是利用其中一个{{1},你会感谢你自己}类别。