这是参考Apple的AVCam示例代码:
actor CaptureService {
// The app's capture session.
private let captureSession = AVCaptureSession()
// A serial dispatch queue to use for capture control actions.
private let sessionQueue = DispatchSerialQueue(label: "com.example.apple-samplecode.AVCam.sessionQueue")
// Sets the session queue as the actor's executor.
nonisolated var unownedExecutor: UnownedSerialExecutor {
sessionQueue.asUnownedSerialExecutor()
}
...
}
然后在 Actor 代码中:
// Set the controls delegate.
captureSession.setControlsDelegate(controlsDelegate, queue: sessionQueue)
如果我理解正确的话,此代码的效果是通过sessionQueue
隐式调用使所有隔离方法调用和可变状态修改有效地发生在sessionQueue.sync()
。我的理解正确吗?还是还有更多内容?
这定义了一个使用自定义执行器的参与者,即 GCD 串行队列:
但正如您注意到的,这
CaptureService
将配置 aCaptureControlsDelegate
, aAVCaptureSessionControlsDelegate
也使用同一个队列:CaptureControlsDelegate
因此,在 上调用的委托方法sessionQueue
,当这些方法发布到 时CaptureSession
,参与者可以观察到它,并且不会出现任何数据争用:因此,这并不是在执行 GCD
sync
调用。它只是将预并发、基于队列的 API 与 结合起来actor
。