swift - 如何同时调用多个操作
问题描述
我知道我可以使用 GCD 或 OperationQueue 来执行并发工作负载,但我一直在尝试寻找一种方法来调用多个函数并让它们同时启动。
我的项目是一次触发多个网络摄像头,以同步来自不同摄像头的照片。
我在这里找到了有关如何同时显示来自多个网络摄像头的多个提要的这篇文章:运行多个 AVCaptureSessions 或添加多个输入
我不确定我如何能够从这些触发照片捕获,但我首先想看看我将如何同步对函数的调用。
我的理论解决方案是这样的:
- 创建并发操作队列
- 这样做,以便我可以手动启动操作队列,而不是自动启动每个操作,因为它将被添加到队列中(如何?)
- 添加一个从相关视频输入中获取图片的操作。每台摄像机一次
- 启动操作队列
- 等待操作完成
- 继续工作流程
这可能吗 ?
如果不是,是否真的可以一次调用多个方法?
如果即使这也不可能,我将如何同步照片捕获,也许录制一个短视频,在录制开始之前使用时间戳来调整延迟并在生成的视频中的特定时间捕获帧?
同样在评论中, swift 内置的 MacOS 应用程序的标签是什么?这是我第一次要求这个而不是 iOS,所以它会帮助找到可能能够提供帮助的人。
感谢您能给我的任何见解!
解决方案
你走在正确的轨道上(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
触发。
推荐阅读
- google-apps-script - Google 表格脚本 HTML 在屏幕上输出一整行
- python-3.x - 带有 Gstreamer 的 cv2。错误:GST_PIPELINE 语法。y:716:priv_gst_parse_yyparse:没有元素 xxx
- python - 使用 Airflow 的 Impala 查询
- android - 如何为 UI 和 Android 服务使用两个 android 应用程序类?
- git - 我可以从 git-lfs 中排除一些文件吗?
- gulp - gulp-clean 和 del 无法清理我想要的文件夹
- python - 使用 ExternalCredentials 对 rabbitmq 进行身份验证
- apache-kafka - 处于状态时等待连接超时:CONNECTING
- python - 使用 Counter().most_common 找到所有具有相同计数的元素
- python - 最后一个子进程启动后,主进程什么也没有执行,为什么?