Ios 从DispatchGroup wait获取最新结果

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

问题描述:

我想通过“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
}
让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”