3

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

我认为有2种方式来做到这一点:

  1. 使用NSURLConnection执行异步加载,并在didFinishLoading方法使用GCD(说)做加工的背景。

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

我认为第二个方法是更容易编写和将产生更干净的代码,特别是当一个“下载/处理”任务涉及多个连续的服务调用的数据下载。因此,而不是执行会喜欢:

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

,我们将有:

主要(开始) - >背景(下载) - >背景(数据处理) - >主要(UI更新) 这似乎是更清洁的我。

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

而且答案似乎都使​​用概念上类似于方法1

一些建议是否有达到什么没有描述有道在方法2中?

在此先感谢!

+1

看看[AFNetworking](https://github.com/AFNetworking/AFNetworking)。 – 2013-03-07 04:50:05

+0

@MikeD,AFNetworking可以另外在这里执行的是在后台执行JSON解析,不是吗?如果我需要对解析的JSON对象执行昂贵的处理,该怎么办?我认为我正在寻找的是一个设计模式比框架更多:) – wingman123 2013-03-07 05:04:58

+0

我总是使用第二种方法,但第一种方法的优势之一是在iOS 6之前,如果您想要超过240秒的超时请求,它可能取消异步连接。 – prasad 2013-03-07 05:32:12

回答

0

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

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

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