4

在一次工作面试中,有人问我为什么要使用块和 GCD 而不是 NSURLConnection 来异步下载文件。经过一番研究,我还没有找到这样做的充分理由。我有多个应用程序,我只使用 NSURLConnection 就可以同时下载多个。他们的问题是试图确定我是否符合流行的东西(GCD,块),还是以这种方式进行异步获取有任何实际的、实质性的优势?谢谢。

4

5 回答 5

4

在 iOS 7 中,您通常不应该使用基于块的方法来异步下载文件。为了支持后台传输,必须使用NSURLSessionwith 委托方法,并且不能使用基于块的方法。除此之外,无论如何我都不确定这里的“而不是NSURLConnection”是什么意思。

如果他们的意思是sendAsynchronousRequest:queue:completionHandler:(即NSURLConnection),它很方便,但比基于委托的灵活和强大得多NSURLConnection,所以我唯一的答案是“因为有时它更方便,并且在你不这样做时使代码更紧密地结合在一起需要很大的灵活性。”

除非他们真正的意思是 GCD 中真正做到这一点的部分:调度 I/O。有理由直接使用它(特别是如果您使用非 HTTP 协议,或者如果您管理的是 HTTP 服务器而不是客户端),但它们很少见,而且通常不用于“异步下载文件”。在大多数情况下,首选更高级别的 API。

于 2013-10-01T18:29:01.510 回答
1

如果你正在做很多很多的连接,通过非常快速的网络连接传输大量数据,我也许可以看到 NSURLConnection 是如何使用 runloop 进行 I/O 处理的,如果你将这些 NSURLConnections 安排在主运行循环。也就是说,您可以轻松地使用其自己的运行循环来处理较低优先级的后台线程,以使这些操作远离主线程。

如果您不需要 NSURLConnection 的所有额外机制(缓存、身份验证等),dispatch_io*几乎可以肯定是处理原始网络 I/O 的较低开销机制,但您真的会放弃相当多的功能。实际上,期望是非常微不足道的性能改进。

于 2013-10-01T19:37:30.777 回答
0

我不确定。主要是因为 NSURLConnection 的 sendAsynchronousRequest 方法内置了一个使用块的完成处理程序。

也许是一个技巧问题?对我来说,面试官似乎只是想看看你是否可以得出结论,他们都可以发挥相同的作用。

于 2013-10-01T18:25:40.280 回答
0

块和 GCD 不是专门用于下载的,但它们可以使下载更容易。您必须将它们与进行下载的东西(如NSURLConnection)结合使用。

将 GCD 与 an 一起使用的优点NSURLConnection是您可以将其很好地打包在一起,而不必依赖分散的委托方法。您也可以轻松限制连接数量以及暂停和停止连接。

于 2013-10-01T18:27:58.967 回答
0

我为复杂网络设置的“去”设置是使用一个NSOperationQueueNSOperation子类来完成这项工作。

然后每个操作使用 aNSURLConnection及其委托方法来下载数据,然后对其进行处理。

在某种程度上,这已经在使用GCDNSOperationQueue但我看不出有理由使用任何其他结合块和 GCD 等的方法......

他们给了你一个“正确”的答案吗?

于 2013-10-02T11:33:32.720 回答