繁体   English   中英

在Swift中使用dispatchGroup处理一系列异步函数时出错

[英]Error in handling a series of async functions using dispatchGroup in Swift

我有一个项目,其中包含2组异步函数,这些函数应按顺序执行。 执行完所有异步函数后,我尝试运行function3

这是我的代码的高级结构:

class VC: UIViewController {
    let dispatchGroup = DispatchGroup()
    let dispatchGroup2 = DispatchGroup()
    override func viewDidLoad() {

        asyncFunc1()

        dispatchGroup.notify(queue: .main) {
            asyncFunc2()
        }

        dispatchGroup2.notify(queue: .main) {
            print("all done")
            function3()
        }
    }

    func asyncFunc1() {
        for item in itemArray {
            dispatchGroup.enter()
            Alamofire.request(urlString).responseString { response in
                dispatchGroup.leave()
            }
        }
    }

    func asyncFunc2() {
        for item in itemArray2 {
            dispatchGroup2.enter()
            Alamofire.request(urlString).responseString { response in
                dispatchGroup2.leave()
            }
        }
    }
}

我的期望是,函数按asyncFunc1() -> asyncFunc2() -> function3()顺序运行。 当我实际运行该应用程序时,我看到在程序运行的开始时就触发了dispatchGroup2.notify ,并且在asyncFunc2完成之后再也不会被调用。 这是怎么了 我试过用一个dispatchGroup变量而不是2( dispatchGroupdispatchGroup2 ),但这再也不起作用了。

我建议一个简单的重构方法那些DispatchGroup 封装在相应的异步函数中:

func asyncFunc(completion: @escaping () -> Void) {
    let dispatchGroup = DispatchGroup()
    for ... {
        dispatchGroup.enter()
        request ... {
            dispatchGroup.leave()
        }
    }
    dispatchGroup.notify(queue: .main) { 
        completion() // Async function completed! 
    }
}

这将导致一个非常好的/紧凑的顶级解决方案:

asyncFunc1 {
    self.asyncFunc2 {
        print("all done")
        self.function3()
    }
}

最初的错误 您的原始问题是由在相应的enter()方法之前调用notify(queue:)引起的。 您的调度小组甚至在开始之前就结束了;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM