Ios 从DispatchGroup wait获取最新结果
问题描述: 我想通过“DispatchGroup”执行一系列异步任务,当所有任务都完成时,它会返回结果。此外,我想设置限制进程的超时,并在该时间之前将成功的结果发送给我。我使用了以下结构: 代码块Ios 从DispatchGroup wait获取最新结果,ios,swift,grand-central-dispatch,Ios,Swift,Grand Central Dispatch,问题描述: 我想通过“DispatchGroup”执行一系列异步任务,当所有任务都完成时,它会返回结果。此外,我想设置限制进程的超时,并在该时间之前将成功的结果发送给我。我使用了以下结构: 代码块 let myGroup = DispatchGroup() var result = [Data]() for i in 0 ..< 5 { myGroup.enter() Alamofire.request("https://httpbin.org/get", parame
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
}
让myGroup=DispatchGroup()
变量结果=[数据]()
对于0..<5中的i{
myGroup.enter()
Alamofire.request(“https://httpbin.org/get,参数:[“foo”:“bar]”)。responseJSON{response in
打印(“已完成的请求\(i)”)
result.append(response.data)
myGroup.leave()
}
}
//超时10秒
myGroup.wait(超时:DispatchTime(正常运行时间:1000000000))
myGroup.notify(队列:.main){
返回结果
}
如果发生超时,如何获取最新结果?好,因此您正确使用了
DispatchGroup
的输入/离开功能,但在如何访问这些结果方面遇到了问题。我认为您尝试同时使用wait
和notify
是错误的,这两个函数提供了两个通常不一起使用的不同功能。设置好工作项后,正如您所做的那样,您有两个选项:
等待
方法notify
方法等待
(这似乎是您想要的?)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()
}
}
好的,您正确使用了
DispatchGroup
的输入/离开功能,但在如何访问这些结果方面遇到了问题。我认为您尝试同时使用wait
和notify
是错误的,这两个函数提供了两个通常不一起使用的不同功能。设置好工作项后,正如您所做的那样,您有两个选项:
等待
方法notify
方法等待
(这似乎是您想要的?)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()
}
}
抱歉,我编辑了结果,我只是试图简化问题,但丢失了itAh的一部分,仅一秒,我将为您重新编写我的答案:)谢谢@george green,但它引发了一个错误:使用未解析标识符“handleCallback”抱歉,我编辑了结果,我只是试图简化问题,但丢失了itAh的一部分,仅一秒,将为您重新编写我的答案:)谢谢@george green,但它引发了一个错误:使用未解析标识符“handleCallback”