将参与者的组合发布者暴露为非隔离属性是否会违反参与者的线程安全性?

问题描述 投票:0回答:1

在以下示例中,私有

_valuePublisher
已通过
Publisher
属性公开为类型擦除的
nonisolated
。此外,
_valuePublisher
的当前值也作为
nonisolated
属性公开。编译器对这种安排感到满意,但我不确定线程安全方面的问题,尤其是对于
unwrappedValue
属性。有什么想法吗?

final actor MyActor {
    
    private let _valuePublisher = CurrentValueSubject<Int, Never>(0)
    
    nonisolated var valuePublisher: AnyPublisher<Int, Never> {
        _valuePublisher.eraseToAnyPublisher()
    }
    
    nonisolated var unwrappedValue: Int {
        _valuePublisher.value
    }
    
    func updateValue(_ value: Int) {
        _valuePublisher.send(value)
    }
}
thread-safety swift-concurrency
1个回答
0
投票

在检查 Swift 并发的正确性时,我建议将“Strict Concurrency Checking”设置更改为“Complete”:

当您这样做时,它会警告您出现的问题:

作为一般规则,您希望计算属性能够反映包装属性的语义。我们在

weak
计算属性方面也遇到了类似的问题。

© www.soinside.com 2019 - 2024. All rights reserved.