Bản hợp đồng nằm dưới mọi toán tử
Publisher cam kết phát ra giá trị thuộc một kiểu, và nếu hỏng thì hỏng bằng đúng một kiểu lỗi.
Subscriber cam kết nhận chúng và nói rõ mình nhận được bao nhiêu.
protocol Publisher<Output, Failure> {
associatedtype Output
associatedtype Failure: Error
func receive<S: Subscriber>(subscriber: S)
where S.Input == Output, S.Failure == Failure
}
Chỗ người ta hay bỏ sót là demand. Subscriber không nhận một cách thụ động; nó yêu cầu một số
lượng giá trị, và publisher không được gửi nhiều hơn thế. Đó chính là cơ chế backpressure của
Combine, và cũng là lý do sink — vốn yêu cầu .unlimited — là công cụ sai ngay khi bên sản xuất
nhanh hơn bên tiêu thụ.
Một subscription sống đúng bằng thời gian bạn còn giữ AnyCancellable:
final class SearchModel {
private var cancellables: Set<AnyCancellable> = []
func start() {
publisher.sink { … }.store(in: &cancellables)
}
}
Buông tham chiếu đó ra là luồng đứt giữa chừng — một lỗi câm lặng, vì không có lỗi nào được ném ra và không có gì được ghi log.
Đây là chương mẫu. Phần nội dung đầy đủ vẫn đang được viết.