【问题标题】:Performing network and other time consuming tasks in background在后台执行网络和其他耗时的任务
【发布时间】:2013-03-07 04:43:00
【问题描述】:

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

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

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

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

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

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

我们会:

ma​​in(开始)-> 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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    相关资源
    最近更新 更多