Swift功能与SuccessHandler一起使用SuccessHandler调用其他功能



我有一个方法a,可以返回闭合结果。现在,此函数在成功概括的其他方法B上迭代。我该怎么做?

伪代码:

func methodA(successHandler: @escaping () -> (Int)){
   for object in objects{
      object.methodB{
        successHander()
      }
   }
}
func methodB(successHandler: @escaping () -> ()){
   successHander(42)
}

让我们从一个更好的示例开始,使用真实的异步任务。

以下将创建10个异步任务,所有这些任务都将其称为成功处理程序的随机间隔从0到10秒:

func methodA(successHandler: @escaping (String) -> ()){
    let objects = (1...10).map { "Block ($0)" }
    for object in objects {
        methodB(message: object) { print($0) }
    }
    successHandler("Everything done")
}
func methodB(message: String, successHandler: @escaping (String) -> ()){
    let randomSecs = DispatchTimeInterval.seconds(Int(arc4random_uniform(10)))
    DispatchQueue.global(qos: .background).asyncAfter(deadline: .now() + randomSecs) {
        successHandler(message)
    }
}
methodA {
    print($0)
}
sleep(12000)

并使用DispatchGroup等待所有子任务完成并在完成块中返回其结果:

func methodA(successHandler: @escaping (String, [String]) -> ()){
    let objects = (1...10).map { "Block ($0)" }
    let queue = DispatchQueue.global(qos: .background)
    let dispatchGroup = DispatchGroup()
    var results: [String] = []
    for object in objects {
        dispatchGroup.enter()
        methodB(message: object) {
            print($0)
            results.append($0)
            dispatchGroup.leave()
        }
    }
    dispatchGroup.notify(queue: queue) {
        successHandler("Everything done", results)
    }
}
func methodB(message: String, successHandler: @escaping (String) -> ()){
    let randomSecs = DispatchTimeInterval.seconds(Int(arc4random_uniform(10)))
    DispatchQueue.global(qos: .background).asyncAfter(deadline: .now() + randomSecs) {
        successHandler(message)
    }
}
methodA {
    print($0, $1)
}
sleep(12000)

请注意,这是控制台应用程序的示例。在UI应用程序(MACOS/iOS(中,您可以将DispatchQueue.main用作通知队列,而您不需要sleep

最新更新