如何同时调用多个操作

时间:2018-11-16 01:31:15

标签: swift macos

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

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

我发现了有关如何在此处Run multiple AVCaptureSessions or add multiple inputs

一次显示多个网络摄像头的多个供稿的信息。

目前尚不确定我将如何从这些照片中触发照片捕获,但是我首先想了解如何同步对该函数的调用。

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

  • 创建并发操作队列
  • 进行设置,以便我可以手动启动操作队列,而不是像添加到队列中那样自动启动每个操作(如何操作)
  • 添加将从相关视频输入中拍摄照片的操作。每个摄像机一次
  • 启动操作队列
  • 等待操作完成
  • 继续工作流程

这可能吗?

如果不是真的可以一次真正地调用多个方法呢?

如果甚至无法做到,我将如何同步照片捕获,也许录制短视频,在录制开始之前立即使用时间戳来调整延迟并在生成的视频中的特定时间捕获帧?

还在评论中,swift内置的MacOS应用程序的标记是什么?这是我第一次问这个问题,而不是iOS,因此它将帮助找到可能有帮助的人。

感谢您可能给我的任何见识!

1 个答案:

答案 0 :(得分:0)

为此您在正确的轨道上(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