首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在后台执行网络和其他耗时的任务

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

Stack Overflow用户
提问于 2013-03-07 04:43:00
回答 1查看 441关注 0票数 3

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

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

  1. 使用NSURLConnection执行异步加载,在didFinishLoading方法中使用GCD (例如)在后台执行处理。
  2. 使用GCD的 dispatch_async (例如)在后台开始工作,并使用NSURLConnection's sendSynchronousRequest:returningResponse:error同步下载数据,处理数据,并在主线程上调用UI更新。

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

主(开始) ->背景(下载) -> main (**NSURLConnectionDelegate** method) ->背景(数据处理) -> main (**UI** update)

我们应该:

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

我发现了两个类似的问题:良好的模式为互联网请求与大中央调度?

NSURLConnection与中央大调度

这两种方法的答案似乎都暗示使用与方法1在概念上类似的东西。

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

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2013-09-29 01:18:22

我不倾向于使用选项2,虽然它具有一定的简单性,但sendSynchronousRequest在下载过程中不提供进度更新,无法取消请求(以及其他更复杂的场景)。NSURLConnectionDataDelegate方法为您提供了对网络请求的更多控制。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15263231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档