我以为Combine
应该是线程安全的,尽管文档很少。我注意到,当在CurrentValueSubject
初始化线程以外的线程上发布时,某些内部会发生持续崩溃dispatch_assert_queue_fail
。
这发生在启用 的包中StrictConcurrency
。如果我禁用它,崩溃就会消失。有趣的是,当我把它放回去时,一致的崩溃不会再出现,直到我清除我的DerivedData
。
Publisher
这是预料之中的吗?如果我想要一个线程安全的解决方案来将值发布到同时保持严格的并发性,建议怎么做?
完整代码:
@preconcurrency import Combine
final class CombineTests: XCTestCase {
@MainActor
func testExample() throws {
let exp = expectation(description: "received 1")
let currentValue = CurrentValueSubject<Int, Never>(0)
let cancellable = currentValue.eraseToAnyPublisher().sink { value in
if value == 1 {
exp.fulfill()
}
}
DispatchQueue.global(qos: .background).async {
currentValue.send(1)
}
wait(for: [exp], timeout: 1)
_ = cancellable
}
}