【发布时间】:2013-03-07 04:43:00
【问题描述】:
我正在开发一个基于网络的 iOS 应用程序,它从服务器下载 json 数据并对其进行处理。下载任务和处理任务都需要很长时间才能完成,所以我不想在主线程上执行。
我认为有两种方法可以做到这一点:
使用
NSURLConnection执行异步加载,并在didFinishLoading方法中使用GCD(比如)在后台进行处理。使用GCD的
dispatch_async(比如)在后台开始工作,使用NSURLConnection'ssendSynchronousRequest:returningResponse:error同步下载数据,对数据进行处理,并调用@ 987654329@主线程更新。
我认为第二种方法更容易编写并且会产生更清晰的代码,特别是如果一个“下载/处理数据”任务涉及多个顺序服务调用以下载数据。所以与其执行如下:
主(开始)->后台(下载)->主(NSURLConnectionDelegate方法)->后台(数据处理)->主(UI更新)
我们会:
main(开始)-> background(下载)-> background(数据处理)-> main(UI更新) 这对我来说似乎更干净。
我发现了 2 个类似的问题:Good pattern for Internet requests with Grand Central Dispatch?
还有
NSURLConnection and grand central dispatch
两者的答案似乎都建议使用在概念上类似于方法 1 的东西。
是否没有适当的方法来实现方法 2 中描述的内容?
提前致谢!
【问题讨论】:
-
看看AFNetworking。
-
@MikeD,AFNetworking 在这里还可以做的是在后台执行 JSON 解析,不是吗?如果我需要对解析的 JSON 对象执行昂贵的处理怎么办?我认为我正在寻找的更多是设计模式而不是框架:)
-
我一直在使用第二种方法,但第一种方法的一个优势是在 ios 6 之前,如果您想在 240 秒内使发布请求超时,可以通过取消异步连接来实现。
-
为什么不让自己更轻松并使用
sendAsynchronousRequest:queue:completionHandler:?您可以将dispatch_async放在completionHandler 中以在后台线程上进行处理。 -
@ChristopherPickslay,假设我们需要调用多个 Web 服务来完成一个“任务”。然后我们必须在块中写入块。此外,当您必须通过对象层次结构进行处理时,事情可能会变得复杂。我并不是说这不能做到,但第二种方法似乎更容易实现。我正在尝试找出我不应该这样做的任何理由。
标签: ios multithreading networking nsurlconnection grand-central-dispatch