【问题标题】:how to call multiple operations at the same time如何同时调用多个操作
【发布时间】:2018-11-16 01:31:14
【问题描述】:

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

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

我在这里找到了这篇关于如何同时显示来自多个网络摄像头的多个提要的帖子:Run multiple AVCaptureSessions or add multiple inputs

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

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

  • 创建并发操作队列
  • 这样我就可以手动启动操作队列,而不是自动启动每个操作,因为它将被添加到队列中(如何?)
  • 添加一个从相关视频输入中获取图片的操作。每台摄像机一次
  • 启动操作队列
  • 等待操作完成
  • 继续工作流

这可能吗?

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

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

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

感谢您提供的任何见解!

【问题讨论】:

    标签: swift macos


    【解决方案1】:

    你在正确的轨道上(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。

    【讨论】:

      猜你喜欢
      • 2022-06-13
      • 2020-01-25
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多