【问题标题】:How to stop loading data [duplicate]如何停止加载数据[重复]
【发布时间】:2013-12-24 00:55:45
【问题描述】:

我有一个 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];
            });

        }); 

【问题讨论】:

  • 您的具体要求是什么??何时停止加载数据??

标签: ios objective-c dispatch-async


【解决方案1】:

dataWithContentsOfURL: 无法做到这一点。您需要切换到使用NSURLConnection 而不是dispatch_async 下载数据。然后您可以致电[connection cancel] 停止下载。有关设置的详细信息,请参阅URL Loading System

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

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

【讨论】:

    【解决方案2】:

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

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

    [currentImgView setImageWithURL:url];
    

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

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

    【讨论】:

      猜你喜欢
      • 2019-12-20
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      相关资源
      最近更新 更多