2017-10-28 81 views
0

我有一個包含2組異步函數的項目,它們應該按順序執行。在執行完所有異步函數之後,我試圖運行function3在Swift中使用dispatchGroup處理一系列異步函數時出錯

這裏是我的代碼高層結構:

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),但這不再工作。

回答

1

我建議一個簡單的重構來包封那些DispatchGroups相應異步函數內:

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() 
    } 
} 

最初的bug。您的原始問題是由於在對應的enter()方法之前致電notify(queue:)造成的。你的派遣小組甚至在它開始之前已經結束了;)

+1

工程就像一個魅力!非常感謝您指出我的錯誤並提出新的答案。我希望我可以多次註冊這個遊戲;) – user7418039

相關問題