【问题标题】:Why use GCD and blocks for HTTP downloads?为什么使用 GCD 和块进行 HTTP 下载?
【发布时间】:2013-10-01 18:21:57
【问题描述】:

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

【问题讨论】:

  • 我可以给你一个不这样做的理由。同时连接有一个限制,一旦达到,块将阻塞等待,GCD 将看到 CPU 空闲,它会触发更多的块,这将产生更多的空闲块。我希望他们给你一个更具体的例子,说明他们认为你应该如何使用块进行下载。

标签: ios nsurlconnection block grand-central-dispatch


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

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

          他们有没有给你一个“正确”的答案?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-07-14
            • 2012-01-19
            • 1970-01-01
            • 2011-11-30
            相关资源
            最近更新 更多