Trang chủ

Publisher và Subscriber

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ụ.

Vòng đời

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.