gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:43:01 24 4
gpt4 key购买 nike

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

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

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

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

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

ma​​in(启动)-> background(下载)-> main(NSURLConnectionDelegate 方法)-> background(数据处理)-> main(UI 更新)

我们会:

ma​​in(开始)->后台(下载)->后台(数据处理)->main(UI更新)这对我来说似乎更干净。

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

这两个问题的答案似乎都建议使用概念上类似于方法 1 的方法。

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

提前致谢!

最佳答案

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

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

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

关于ios - 在后台执行网络和其他耗时的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15263231/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com