Eu tinha a impressão de que Combine
deveria ser thread safe, mesmo que a documentação seja escassa. Percebi que ao publicar em CurrentValueSubject
um thread diferente daquele em que foi inicializado, há uma falha consistente em alguns dispatch_assert_queue_fail
.
Isso está acontecendo em um pacote onde StrictConcurrency
está habilitado. Se eu desabilitá-lo, o crash desaparece. Curiosamente, quando eu o coloco de volta, o crash que era consistente não volta até que eu limpe meu DerivedData
.
Isso é esperado? O que é recomendado se eu quiser uma solução thread safe para publicar valores em um Publisher
enquanto mantenho a concorrência estrita em ?
Código completo:
@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
}
}