我正在开发一个基于网络的iOS应用程序,它从服务器下载json数据并对其进行处理。下载任务和处理任务都需要很长时间才能完成,所以我不想在主线程上执行任何操作。
我认为有两种方法可以做到这一点:
使用NSURLConnection
执行异步加载,在didFinishLoading
方法中使用 GCD (比如说)在后台进行处理。
使用 GCD dispatch_async
(比如说)开始在后台工作,并使用NSURLConnection's
sendSynchronousRequest:returningResponse:error
同步下载数据,进行处理数据,并在主线程上调用UI
更新。
我认为第二种方法更容易编写,并且会生成更清晰的代码,特别是如果一个“下载/处理数据”任务涉及多个顺序服务调用数据下载。所以而不是执行如下:
main(开始) - >背景(下载) - > main(NSURLConnectionDelegate
方法) - >背景(数据处理) - > main(UI
更新)
我们会:
main(开始) - >背景(下载) - >背景(数据处理) - >主(UI更新) 这似乎对我来说更清洁。
我发现了两个类似的问题:Good pattern for Internet requests with Grand Central Dispatch?
和
NSURLConnection and grand central dispatch
两者的答案似乎都建议使用概念上类似于方法1的东西。
没有正确的方法来实现方法2中描述的内容吗?
提前致谢!
答案 0 :(得分:0)
我不会倾向于选择#2选项。虽然它具有一定的简单性,但sendSynchronousRequest
在下载期间无法提供进度更新,取消请求的能力(以及其他更复杂的方案)。 NSURLConnectionDataDelegate
方法可以让您更好地控制网络请求。
这个问题假定基于GCD的模式,但我认为操作队列模式值得考虑。您可以将NSURLConnectionDataDelegate
方法提供的控制与封装网络请求的可取消操作结合在一起。当您开始变得更复杂时,您可以开始使用并发请求,但也会限制并发程度(例如,不超过五个并发请求)。
我建议你看看AFNetworking。也许您不想使用该框架,但我仍然会看一下它采用的基于操作队列的模式。我个人将这种模式用于上述任何一种GCD方法。