【问题标题】:Understanding the behaviour of [NSData dataWithContentsOfURL:URL] inside the GCD block了解 GCD 块内 [NSData dataWithContentsOfURL:URL] 的行为
【发布时间】:2013-08-28 08:31:03
【问题描述】:

以下问题/陈述仅限于我的理解,如果我在这里错了,请告诉我。

发件人:Issue with GCD and too many threads

转发 jackslash 的答案,我想知道大多数开发人员都有使用 [NSData dataWithContentsOfURL:URL] 的习惯,这似乎确实会阻塞(直到它完成)。如果您通过 URL 获取一些小细节,这可能是理想的。但是在在多进程的情况下(我的意思是同时下载多个文件),GCD 必须创建许多线程并且不是下载数据的完美方式。

因此一些专家建议使用称为[NSURLConnection sendAsynchronousRequest:queue:completionHandler: 的GCD 抽象来处理这种情况(也很理想)。

我唯一的问题是[NSURLConnection sendAsynchronousRequest:queue:completionHandler: 将如何利用 NSData dataWithContentsOfURL:URL] 创建新线程并避免我们被阻塞?

非常感谢您记录在案的任何答案。

【问题讨论】:

  • 有趣的是,我的实验发现在 GCD 中使用 NSDataNSURLConnection 方法在线程创建方面没有区别。在调度超过 100 个请求时,无论哪种方式都达到了大约 70 个线程的峰值。
  • @CarlVeazey...但想知道为什么专家建议使用 NSURLConnection 方法...事实上在 AFNetworking 库中他们更喜欢相同的方法...

标签: iphone ios objective-c xcode ios6


【解决方案1】:

您的问题实际上与 GCD 无关:它是关于同时下载多个文件的最佳策略。

最好的策略就是不这样做。例如,尝试同时下载 100 个单独的文件是一个坏主意,尤其是当用户使用蜂窝连接时(他们可能是)。你说得对,dataWithContentsOfURL 通常也不是一个好主意。

也就是说,这里有一个中间立场。如果有办法告诉 iOS“一次下载 X 个文件,但仅此而已”,那就太好了。为此,我们可以使用NSOperationQueue。操作队列包含许多操作并将它们放入队列中(在这种情况下,队列在后台运行)。例如:

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
[operationQueue setMaxConcurrentOperationCount:3];
[operationQueue addOperations:@[download1, download2, download3] waitUntilFinished:NO];

在这里,我们创建了一个可以支持三个同时下载的操作队列。使用操作队列的优势应该是显而易见的。许多开发人员选择使用像 AFNetworking 这样的库来帮助他们管理下载,并且有很多指南可以在操作队列中同时使用这个库和 NSURLConnection

【讨论】:

  • 感谢您提供详细信息...是的,我同意您的看法...只是想从您那里提取更多信息,关于 NSOperationQueue 如何产生影响...我的意思是它更快并且足够高效吗?...正如您所说,它在后台运行...
  • NSOperationQueue 可以帮助您,因为它可以让您控制 最大 个并发操作。假设您有 100 个要下载的单独文件。显然,创建 100 个独特的线程是一个非常糟糕的主意。但是使用操作队列,您可以指定并发操作的最大数量(例如,一次 3 个),并确保不会超过该数量。
【解决方案2】:

sendAsynchronousRequest:queue:completionHandler: 不使用 GCD 进行实际下载。您传入的队列仅用于执行完成块。下载本身将在其内部实现中使用低级异步套接字 API,因此不会有任何阻塞或不必要的线程创建。

【讨论】:

    猜你喜欢
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多