gpt4 book ai didi

iphone - 了解GCD block 中[NSData dataWithContentsOfURL:URL]的行为

转载 作者:行者123 更新时间:2023-12-01 18:19:34 25 4
gpt4 key购买 nike

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

来自: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的,而是关于同时下载多个文件的最佳策略。

最好的策略就是不这样做。尝试同时下载100个单独的文件是一个坏主意,特别是如果用户正在使用蜂窝连接(可能是)时。您正确地知道dataWithContentsOfURL通常也不是一个好主意。

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

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

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

关于iphone - 了解GCD block 中[NSData dataWithContentsOfURL:URL]的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18482968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com