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

标签 ios swift asynchronous alamofire grand-central-dispatch

我有一个包含 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),但这再次不起作用。

最佳答案

我会推荐一个简单的重构来封装那些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()
    }
}

初始错误。您最初的问题是由于在相应的 enter() 方法之前调用 notify(queue:) 引起的。你的 dispatch 组还没开始就结束了 ;)

关于ios - 在 Swift 中使用 dispatchGroup 处理一系列异步函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46995362/

相关文章:

ios - 如何在 iOS View 中添加虚线

ios - 以编程方式读取 PDF 嵌入式搜索索引

ios - 无法在 Swift 中执行 NSURLSession.sharedSession().dataTaskWithURL

python - 为什么较长的 HTTP 往返时间会使我的 Tornado AsyncHttpClient 停滞不前?

android - 将数组存储到对象数据类型到 android 和 iOS 中的 firestore(swift)

ios - 在 iOS 的自定义抽屉导航中状态栏颜色更改为白色?

ios - 在 Google Sign In 调用 App Delegate 中的方法后关闭 View Controller (iOS/Swift)

ios - Swift 的核心数据 transient 值

asp.net-mvc-2 - ASP.NET MVC 2 关于异步 Controller 的问题

javascript - 如何在异步函数之外设置一个 var 以在 $scope 对象中使用