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