2017-10-28 131 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