我正在开发一个基于网络的iOS应用程序,它可以从服务器下载json数据并对其进行处理。下载任务和处理任务都需要很长时间才能完成,所以我不想在主线程上执行这两个任务。
我认为有两种方法可以做到:
NSURLConnection执行异步加载,在didFinishLoading方法中使用GCD (例如)在后台执行处理。dispatch_async (例如)在后台开始工作,并使用NSURLConnection's sendSynchronousRequest:returningResponse:error同步下载数据,处理数据,并在主线程上调用UI更新。我认为第二种方法会更容易编写,并且会产生更清晰的代码,特别是当一个“下载/处理数据”任务涉及多个数据下载的顺序服务调用时。因此,与其执行类似于:
主(开始) ->背景(下载) -> main (**NSURLConnectionDelegate** method) ->背景(数据处理) -> main (**UI** update)
我们应该:
主要(开始) ->背景(下载) ->背景(数据处理) -> main (UI更新),对我来说似乎更清晰。
我发现了两个类似的问题:良好的模式为互联网请求与大中央调度?和
这两种方法的答案似乎都暗示使用与方法1在概念上类似的东西。
是否没有适当的方法来实现方法2中描述的内容?
提前感谢!
发布于 2013-09-29 01:18:22
我不倾向于使用选项2,虽然它具有一定的简单性,但sendSynchronousRequest在下载过程中不提供进度更新,无法取消请求(以及其他更复杂的场景)。NSURLConnectionDataDelegate方法为您提供了对网络请求的更多控制。
这个问题假定基于GCD的模式,但我认为操作队列模式值得考虑.可以将NSURLConnectionDataDelegate方法提供的控件与封装网络请求的可取消操作结合起来。当您开始变得更加复杂时,您可以开始使用并发请求,但也可以限制并发的程度(例如,不超过5个并发请求)。
我建议你看看AFNetworking。也许您不想使用这个框架,但我还是要看看它所使用的基于操作队列的模式。我个人会在上述任何一种GCD方法上使用这种模式。
https://stackoverflow.com/questions/15263231
复制相似问题