3

我正在开发一个基于网络的 iOS 应用程序,它从服务器下载 json 数据并对其进行处理。下载任务和处理任务都需要很长时间才能完成,所以我不想在主线程上执行。

我认为有两种方法可以做到这一点:

  1. NSURLConnection使用和在didFinishLoading方法中使用GCD执行异步加载(比如)在后台进行处理。

  2. 使用GCD dispatch_async(比如说)在后台开始工作并使用NSURLConnection's sendSynchronousRequest:returningResponse:error同步下载数据,对数据进行处理,并UI在主线程上调用更新。

我认为第二种方法更容易编写并且会产生更清晰的代码,特别是如果一个“下载/处理数据”任务涉及多个用于数据下载的顺序服务调用。因此,与其执行如下:

主(开始)->后台(下载)->主(NSURLConnectionDelegate方法)->后台(数据处理)->主(UI更新

我们会有:

main(开始)-> background(下载)-> background(数据处理)-> main(UI更新)对我来说似乎更干净。

我发现了 2 个类似的问题:Grand Central Dispatch 的 Internet 请求的良好模式?
NSURLConnection 和盛大的中央调度

两者的答案似乎都建议使用在概念上类似于方法 1 的东西。

是否没有适当的方法来实现方法 2 中描述的内容?

提前致谢!

4

1 回答 1

0

我不会倾向于追求选项#2。尽管它具有一定的简单性,sendSynchronousRequest但在下载过程中不提供进度更新、取消请求的能力(以及其他更复杂的场景)。一种NSURLConnectionDataDelegate方法使您可以更好地控制网络请求。

这个问题假定基于 GCD 的模式,但我认为操作队列模式值得考虑。您可以将NSURLConnectionDataDelegate方法提供的控制与封装网络请求的可取消操作结合起来。当您开始变得更复杂时,您可以开始使用并发请求,但也限制并发程度(例如不超过五个并发请求)。

我建议看看AFNetworking。也许你不想使用那个框架,但我还是会看看它采用的基于操作队列的模式。我个人会在上述任一 GCD 方法中使用该模式。

于 2013-09-29T01:18:22.893 回答