簡體   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