Isto é com referência ao código de exemplo AVCam da Apple:
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()
}
...
}
E mais tarde no código do Ator:
// Set the controls delegate.
captureSession.setControlsDelegate(controlsDelegate, queue: sessionQueue)
Se entendi corretamente, o efeito desse código é fazer com que todas as chamadas de método isoladas e modificações de estado mutável aconteçam efetivamente sessionQueue
chamando implicitamente sessionQueue.sync()
. Meu entendimento está correto ou há mais do que isso?
Isso define um ator que está usando um executor personalizado , ou seja, uma fila serial GCD:
Mas, como você observou, isso
CaptureService
configura umCaptureControlsDelegate
, umAVCaptureSessionControlsDelegate
, para também usar a mesma fila:Então, os métodos delegados de
CaptureControlsDelegate
são chamados emsessionQueue
, e quando são publicados emCaptureSession
, eles podem ser observados pelo ator, livre de quaisquer corridas de dados:Então, isso não está realizando uma chamada GCD
sync
. É apenas casar uma API pré-concorrência, baseada em fila, com umactor
.