gpt4 book ai didi

ios - 从 DispatchGroup 等待获取最新结果

转载 作者:行者123 更新时间:2023-11-28 11:55:55 25 4
gpt4 key购买 nike

问题描述:

我想通过“DispatchGroup”执行一系列异步任务,当所有这些任务完成时它返回结果。另外,我想设置限制进程的超时时间,到时候把成功的结果发给我。我使用了以下结构:

代码块

let myGroup = DispatchGroup()

var result = [Data]()
for i in 0 ..< 5 {
myGroup.enter()

Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"]).responseJSON { response in
print("Finished request \(i)")
result.append(response.data)
myGroup.leave()
}
}

// Timeout for 10 seconds
myGroup.wait(timeout: DispatchTime(uptimeNanoseconds: 10000000000))

myGroup.notify(queue: .main) {
return result
}

如果发生超时,如何获取最新的结果?

最佳答案

好的,所以您正确地使用了 DispatchGroup 的进入/离开功能,但是在如何访问这些结果方面遇到了问题。我认为您尝试同时使用 waitnotify 是错误的,这两个函数提供了两个通常不一起使用的不同功能。像您所做的那样设置工作项后,您有两个选择:

  1. 等待方法

此函数会阻塞调用队列并同步等待传入的墙时间结束,或组中的所有工作项离开。因为它阻塞了调用者,所以在此函数中始终有一个超时很重要。

  1. 通知方法

该函数接受一个目标队列,以及一个当您组中的所有工作项都完成时要运行的 block 。在这里,您基本上是要求系统在所有工作项完成后异步通知您。由于这是异步,我们通常不太担心超时,它不会阻塞任何东西。

  1. 异步等待(这似乎是你想要的?)

如果像您那样,我们希望在所有工作项完成后收到通知,但也有超时,我们必须自己做这件事,这并不是那么棘手。我们可以为 DispatchGroup 类添加一个简单的扩展...

extension DispatchGroup {

func notifyWait(target: DispatchQueue, timeout: DispatchTime, handler: @escaping (() -> Void)) {
DispatchQueue.global(qos: .default).async {
_ = self.wait(timeout: timeout)
target.async {
handler()
}
}
}

}

这个简单的函数在全局后台队列上异步调度,然后调用 wait,它将等待所有工作项完成,或者指定的超时时间,以先到者为准。然后它将回调到指定队列上的处理程序。


这就是理论,您如何使用它。我们可以使您的初始设置完全相同

let myGroup = DispatchGroup()

var result = [Data]()
for i in 0 ..< 5 {
myGroup.enter()

Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"]).responseJSON { response in
print("Finished request \(i)")
result.append(response.data)
myGroup.leave()
}
}

然后使用我们的新函数等待结束

myGroup.notifyWait(target: .main,
timeout: DispatchTime.now() + 10) {
// here you can access the `results` list, with any data that has
// been appended by the work items above before the timeout
// was reached
}

关于ios - 从 DispatchGroup 等待获取最新结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51000837/

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