gpt4 book ai didi

swift - 后台获取中多个异步请求的最佳实践是什么?

转载 作者:搜寻专家 更新时间:2023-10-30 22:30:04 24 4
gpt4 key购买 nike

我有一个可以拥有多个用户帐户的应用程序。我需要在后台更新所有这些。问题是:

  • 时间有限(约 30 秒,但请求可能需要更长的时间)
  • 所有请求都是异步的

什么时候应该调用完成处理程序?

最佳答案

Grand Central Dispatch 的群基本上就是为了解决这个问题而生的。来自 Apple 的 documentation关于主题:

A dispatch group is a way to monitor a set of block objects for completion. (You can monitor the blocks synchronously or asynchronously depending on your needs.) Groups provide a useful synchronization mechanism for code that depends on the completion of other tasks. For more information about using groups, see Waiting on Groups of Queued Tasks.

有两种方法可以使用组来监控任务组。第一种是使用异步回调,另一种是阻塞当前队列,直到所有分组任务都完成。无论哪种方式,设置都是相同的。

我将通过一个简单的示例来帮助您入门(我将使用 Swift 进行回答,但同样的方法在 Objective-C 中占 1-1 的比重)。首先,定义您的组:

let group = dispatch_group_create()

为您要完成的每个异步任务输入一次组:

dispatch_group_enter(group)
dispatch_group_enter(group)

运行你的异步任务,当你想将每个任务标记为已完成时,调用 dispatch_group_leave:

firstAsyncTask {
dispatch_group_leave(group)
}

secondAsyncTask {
dispatch_group_leave(group)
}

如上所述,当组中的所有任务都完成后,您可以在当前队列中等待(这会阻塞线程)或指定一个要异步调用的 block 。

等待

dispatch_group_wait(group, 30 * NSEC_PER_SEC)

这将停止在当前线程上执行,直到所有组任务都完成,或者 30 秒后(以较早者为准)。

如果您想删除任何时间限制:

dispatch_group_wait(group, DISPATCH_TIME_FOREVER)

异步

这个比较简单,只是因为它没有太多内容。你指定一个 block 来调用你的 block 作为你的第二个参数。一旦小组的所有任务都完成,这个 block 就称为:

dispatch_group_notify(group, dispatch_get_main_queue()) {
// Code goes here.
}

关于swift - 后台获取中多个异步请求的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29454446/

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