首页 > 解决方案 > 如何同时调用多个操作

问题描述

我知道我可以使用 GCD 或 OperationQueue 来执行并发工作负载,但我一直在尝试寻找一种方法来调用多个函数并让它们同时启动。

我的项目是一次触发多个网络摄像头,以同步来自不同摄像头的照片。

我在这里找到了有关如何同时显示来自多个网络摄像头的多个提要的这篇文章:运行多个 AVCaptureSessions 或添加多个输入

我不确定我如何能够从这些触发照片捕获,但我首先想看看我将如何同步对函数的调用。

我的理论解决方案是这样的:

这可能吗 ?

如果不是,是否真的可以一次调用多个方法?

如果即使这也不可能,我将如何同步照片捕获,也许录制一个短视频,在录制开始之前使用时间戳来调整延迟并在生成的视频中的特定时间捕获帧?

同样在评论中, swift 内置的 MacOS 应用程序的标签是什么?这是我第一次要求这个而不是 iOS,所以它会帮助找到可能能够提供帮助的人。

感谢您能给我的任何见解!

标签: swiftmacos

解决方案


你走在正确的轨道上(NS)OperationQueue就是为此而生的。下面是一个例子:

func operation1() {
    print("\(#function) starts")
    sleep(1)
    print("\(#function) ends")
}

func operation2() {
    print("\(#function) starts")
    sleep(2)
    print("\(#function) ends")
}

func operation3() {
    print("\(#function) starts")
    sleep(3)
    print("\(#function) ends")
}

@IBAction func start(_ sender: Any) {
    let operation = BlockOperation(block: {})
    operation.addExecutionBlock { self.operation1() }
    operation.addExecutionBlock { self.operation2() }
    operation.addExecutionBlock { self.operation3() }

    let endOperation = BlockOperation { self.allFinished() }
    endOperation.addDependency(operation)

    let queue = OperationQueue()
    queue.addOperations([operation, endOperation], waitUntilFinished: false)
}

func allFinished() {
    print("all finished")
}

operation1, 2, 3可以以任意顺序开始,但结束顺序始终为 1、2、3,然后allFinished触发。


推荐阅读