在一次工作面试中,有人问我为什么要使用块和 GCD 而不是 NSURLConnection 来异步下载文件。经过一番研究,我还没有找到这样做的充分理由。我有多个应用程序,我只使用 NSURLConnection 就可以同时下载多个。他们的问题是试图确定我是否符合流行的东西(GCD,块),还是以这种方式进行异步获取有任何实际的、实质性的优势?谢谢。
5 回答
在 iOS 7 中,您通常不应该使用基于块的方法来异步下载文件。为了支持后台传输,必须使用NSURLSession
with 委托方法,并且不能使用基于块的方法。除此之外,无论如何我都不确定这里的“而不是NSURLConnection
”是什么意思。
如果他们的意思是sendAsynchronousRequest:queue:completionHandler:
(即NSURLConnection
),它很方便,但比基于委托的灵活和强大得多NSURLConnection
,所以我唯一的答案是“因为有时它更方便,并且在你不这样做时使代码更紧密地结合在一起需要很大的灵活性。”
除非他们真正的意思是 GCD 中真正做到这一点的部分:调度 I/O。有理由直接使用它(特别是如果您使用非 HTTP 协议,或者如果您管理的是 HTTP 服务器而不是客户端),但它们很少见,而且通常不用于“异步下载文件”。在大多数情况下,首选更高级别的 API。
如果你正在做很多很多的连接,通过非常快速的网络连接传输大量数据,我也许可以看到 NSURLConnection 是如何使用 runloop 进行 I/O 处理的,如果你将这些 NSURLConnections 安排在主运行循环。也就是说,您可以轻松地使用其自己的运行循环来处理较低优先级的后台线程,以使这些操作远离主线程。
如果您不需要 NSURLConnection 的所有额外机制(缓存、身份验证等),dispatch_io*
几乎可以肯定是处理原始网络 I/O 的较低开销机制,但您真的会放弃相当多的功能。实际上,期望是非常微不足道的性能改进。
我不确定。主要是因为 NSURLConnection 的 sendAsynchronousRequest 方法内置了一个使用块的完成处理程序。
也许是一个技巧问题?对我来说,面试官似乎只是想看看你是否可以得出结论,他们都可以发挥相同的作用。
块和 GCD 不是专门用于下载的,但它们可以使下载更容易。您必须将它们与进行下载的东西(如NSURLConnection
)结合使用。
将 GCD 与 an 一起使用的优点NSURLConnection
是您可以将其很好地打包在一起,而不必依赖分散的委托方法。您也可以轻松限制连接数量以及暂停和停止连接。
我为复杂网络设置的“去”设置是使用一个NSOperationQueue
和NSOperation
子类来完成这项工作。
然后每个操作使用 aNSURLConnection
及其委托方法来下载数据,然后对其进行处理。
在某种程度上,这已经在使用GCD
,NSOperationQueue
但我看不出有理由使用任何其他结合块和 GCD 等的方法......
他们给了你一个“正确”的答案吗?