O código a seguir dá erro ao compilar na versão de linguagem Swift 6 no Xcode. Isso é um problema de arquitetura ou tem uma solução fácil? O tipo Bool
é Sendable
, mas seu publicador não é.
Non-sendable type 'Published<Bool>.Publisher' in implicitly asynchronous access to actor-isolated property '$isRecording' cannot cross actor boundary
import Foundation
final class Recorder {
var writer = Writer()
var isRecording = false
func startRecording() {
Task { [writer] in
await writer.startRecording()
print("started recording")
}
}
func stopRecording() {
Task { [writer] in
await writer.stopRecording()
print("stopped recording")
}
}
func observeValues() {
Task {
for await value in await writer.$isRecording.values {
isRecording = value
}
}
}
}
actor Writer {
@Published private(set) public var isRecording = false
func startRecording() {
isRecording = true
}
func stopRecording() {
isRecording = false
}
}
Consulte esta captura de tela para ver os erros reais que vejo no código de exemplo do AVCam (com a única modificação de colocar @preconcurrency
) import AVFoundation
.
Em vez de
@Published
e então obter ovalues
, eu usaria diretamente umAsyncStream
para entregar os valores.AsyncStream
é enviável se os elementos do fluxo forem enviáveis.Então em
observedValues
,Observe que, para
isRecording = value
estar seguro, umobserveValues
ou o todoRecorder
precisa ser isolado para um ator global.