0

我有一个 UIImageView。此 imageView 的图像是从 Web 加载的。有人可以告诉我如何停止加载吗?

这是我的代码:

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];
            });

        }); 
4

2 回答 2

3

你不能用dataWithContentsOfURL:. 您将需要切换到使用NSURLConnection而不是下载数据dispatch_async。然后,您可以调用[connection cancel]以停止下载。有关设置的完整详细信息,请参阅URL 加载系统

请注意,在大多数情况下,除非文件很大,否则取消下载是不值得的。当您开始取消时,数据通常已经在传输中,您最好将其丢弃而不是尝试取消(因为无论如何您都会得到它)。

currentImgView.image = newImg要实施这种方法,您将在您的线路之前检查取消。无论如何,您通常都应该这样做(因为下载可能在您下载它和主队列再次运行之间被取消)。解决此问题的一个好方法是使用NSOperaration,因为它使您可以访问一种方便的cancel方法。请注意,取消操作只是设置一个标志。您可以检查该标志并停止处理。

于 2013-12-06T15:52:52.373 回答
0

我们可以引导您了解如何创建可取消的网络请求(例如NSURLConnectionDataDelegate基于 - 的请求),理想情况下将其包装在NSOperation基于 - 的实现而不是 GCD 中,以促进取消过程(并控制并发程度)。但是那里有很多工作和特殊考虑,我不确定我是否建议沿着这条路走。

UIImageView使用其中一个类别要容易得多( SDWebImage很棒,AFNetworking还可以)。如果您使用这些UIImageView类别之一,它变得如此简单:

[currentImgView setImageWithURL:url];

这不仅会异步加载图像,而且当您删除图像视图(或请求另一个图像)时,它会取消先前的网络请求。或者您可以明确取消它(cancelCurrentImageLoad使用 SDWebImage;cancelImageRequestOperation使用 AFNetworking)。它还将缓存响应(因此,如果您返回同一图像 5 次,则只需从网络请求一次)。

UIImageView如果你真的想“自己动手”,你可以这样做(我们可以为你指明正确的方向),但如果你只是利用这些现有类别之一,你会感谢自己。

于 2013-12-06T16:39:23.850 回答