在后台执行网络和其他耗时的任务

时间:2013-03-07 04:43:01

标签: ios multithreading networking nsurlconnection grand-central-dispatch

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

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

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

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

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

    main(开始) - >背景(下载) - > main(NSURLConnectionDelegate方法) - >背景(数据处理) - > main(UI更新

    我们会:

    main(开始) - >背景(下载) - >背景(数据处理) - >主(UI更新) 这似乎对我来说更清洁。

    我发现了两个类似的问题:Good pattern for Internet requests with Grand Central Dispatch?
    NSURLConnection and grand central dispatch

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

    没有正确的方法来实现方法2中描述的内容吗?

    提前致谢!

1 个答案:

答案 0 :(得分:0)

我不会倾向于选择#2选项。虽然它具有一定的简单性,但sendSynchronousRequest在下载期间无法提供进度更新,取消请求的能力(以及其他更复杂的方案)。 NSURLConnectionDataDelegate方法可以让您更好地控制网络请求。

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

我建议你看看AFNetworking。也许您不想使用该框架,但我仍然会看一下它采用的基于操作队列的模式。我个人将这种模式用于上述任何一种GCD方法。