ios - Swift 4 中 3 个线程的同步

标签 ios swift grand-central-dispatch

我有 3 个线程从互联网下载数据。

func thread1() {
    DispatchQueue.global().async {
        // do something from json
    }
}

func thread2() {
    DispatchQueue.global().async {
        // do something from json
    }
}

func thread3() {
    DispatchQueue.global().async {
        // download img
    }
}


func finishFunction() {
    print("Finish")
}

我想在完成线程 1、2 和 3 后启动 finishFunction 函数。如何实现?

最佳答案

通常,您不会在 sync/async 调用中包装函数体。最好让函数做它做的事,然后让调用者可以灵活地将他们交给调度,使用他们想要的 QoS,在他们想要的队列上,以及他们想要的任何其他标志。

func doSomethingFromJSON1() {}
func doSomethingFromJSON2() {}
func downloadImage() {}

func doItAll() {
    let dispatchGroup = DispatchGroup()

    dispatchGroup.enter()
    DispatchQueue.global().async {
        doSomethingFromJSON1()
        dispatchGroup.leave()
    }

    dispatchGroup.enter()
    DispatchQueue.global().async {
        doSomethingFromJSON2()
        dispatchGroup.leave()
    }

    dispatchGroup.enter()
    DispatchQueue.global().async {
        downloadImage()
        dispatchGroup.leave()
    }

    dispatchGroup.notify(queue: .global) {
        finishFunction()
    }
}

关于ios - Swift 4 中 3 个线程的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49886930/

相关文章:

objective-c - id 确认了一个协议(protocol),但是在哪里实现呢?

ios - 为什么网页 View 会崩溃

objective-c - NSTask 竞争条件与 ReadabilityHandler block

iphone - 尝试使用 animateWithDuration 时找不到方法 '+animateWithDuration:delay:options:animations:'

ios - 如何删除另一次点击的复选标记?

ios 快速写入流

xcode - Swift:条件绑定(bind)中的绑定(bind)值必须是可选的

swift - 如何将 @State 与字典一起使用

json - 从 TableView 中的 JSON 数据下载可重复使用的单元格或错误的异步图像

Swift - 如何防止 DispatchQueues 在同一线程上执行?