Combine là gì?
Framework Combine cung cấp một API Swift khai báo để xử lý các giá trị theo thời gian. Những giá trị này có thể đại diện cho nhiều loại sự kiện bất đồng bộ khác nhau. Combine định nghĩa các publisher để phát tán các giá trị có thể thay đổi theo thời gian, và các subscriber để nhận những giá trị đó từ các publisher.
Khái niệm chính
Publisher
Publisher là trung tâm của toàn bộ quá trình, nó cung cấp các phần tử cho một hoặc nhiều instance Subscriber.
public protocol Publisher {
associatedtype Output
associatedtype Failure : Error
func receive<S>(subscriber: S) where S : Subscriber, Self.Failure == S.Failure, Self.Output == S.Input
}
Tất cả các Publisher đều kế thừa từ protocol này. Protocol Publisher có 2 loại mà bạn phải cung cấp:
- Output: Loại dữ liệu được phát tán
- Failure: Loại dữ liệu cho lỗi
Một publisher sẽ phát tán một trong ba loại giá trị sau:
- giá trị: dữ liệu mà chúng ta cần
- lỗi: subscribers sẽ nhận được lỗi
- hoàn tất: kết thúc chu kỳ sống của một publisher
Subscriber
Subscriber sẽ nhận các giá trị từ Publisher, và tất cả các subscriber đều phải kế thừa từ protocol Subscriber.
public protocol Subscriber {
associatedtype Input
associatedtype Failure: Error
func receive(subscription: Subscription)
func receive(_ input: Self.Input) -> Subscribers.Demand
func receive(completion: Subscribers.Completion<Self.Failure>)
}
- Input: Loại dữ liệu được cung cấp
- Failure: Loại dữ liệu cho lỗi
Ba phương thức quan trọng:
receive(subscription:)
: khi nhận được subscription từ Publisher.receive(input:)
: khi nhận giá trị từ Publisher và chúng ta sẽ điều chỉnh yêu cầu cho dữ liệu tiếp theo thông qua Demand.receive(completion:)
: khi nhận hoàn tất từ publisher.
Có nhiều cách để khởi tạo một subscriber, chẳng hạn như sink
, assign
, …
Chu kỳ sống của Publisher và Subscriber
-
Tạo Publisher:
- Chu kỳ sống bắt đầu khi bạn tạo một publisher. Một publisher phát tán các giá trị theo thời gian, đại diện cho một dòng dữ liệu.
- Publishers có thể được tạo từ nhiều nguồn khác nhau (ví dụ: mảng, yêu cầu mạng, tương tác của người dùng).
-
Đăng ký Subscriber:
- Khi bạn đăng ký một publisher, một subscription được thiết lập.
- Subscriber (người tiêu thụ) nhận các giá trị được phát tán bởi publisher.
- Subscription quản lý kết nối giữa publisher và subscriber.
-
Yêu cầu Subscription:
- Subscriber có thể yêu cầu một số lượng giá trị cụ thể bằng cách sử dụng phương thức
request(_:)
trên subscription. - Số lượng yêu cầu có thể là:
- .none: Không yêu cầu giá trị nào.
- .unlimited: Muốn tất cả giá trị.
- .max(Int): Giới hạn số lượng mục được nhận.
- Subscriber có thể yêu cầu một số lượng giá trị cụ thể bằng cách sử dụng phương thức
-
Phát tán giá trị:
- Khi publisher sản xuất các giá trị (ví dụ: từ một mảng hoặc phản hồi mạng), nó gửi chúng đến subscriber.
- Phương thức
receive(_:)
của subscriber được gọi cho mỗi giá trị được phát tán.
-
Xử lý hoàn tất hoặc lỗi:
- Publishers có thể hoàn tất bình thường hoặc gặp lỗi.
- Khi publisher hoàn tất, phương thức
receive(completion:)
của subscriber được gọi với kết quả hoàn tất. - Nếu có lỗi xảy ra, subscriber nhận được một sự hoàn tất với dạng lỗi.
-
Hủy đăng ký Subscriber:
- Các subscriber có thể hủy bỏ đăng ký của họ bất kỳ lúc nào bằng cách sử dụng phương thức
cancel()
. - Việc hủy bỏ giải phóng tài nguyên và dừng phát tán các giá trị tiếp theo.
- Các subscriber có thể hủy bỏ đăng ký của họ bất kỳ lúc nào bằng cách sử dụng phương thức
Ví dụ sử dụng:
import Combine
let numbers = [1, 2, 3, 4, 5]
let publisher = numbers.publisher
let subscriber = Subscribers.Sink<Int, Never> { value in
print("Nhận giá trị:", value)
}
let subscription = publisher.subscribe(subscriber)
subscription.request(.max(3)) // Chỉ yêu cầu 3 giá trị
swift
// Kết quả:
Nhận giá trị: 1
Nhận giá trị: 2
Nhận giá trị: 3
Các Toán tử
Ở giữa Publisher
và Subscriber
, các toán tử chuyển đổi/lọc các giá trị đã phát tán thành những gì mà subscriber mong muốn. Các Toán tử truyền tiếp lỗi, chỉ thay đổi giá trị. Chúng cũng quản lý lịch trình/thời gian, sự di chuyển giữa các thread/que, và nhiều hơn nữa.
Cảm ơn bạn đã đọc! ✌️
Nếu bạn có bất kỳ câu hỏi hoặc chỉnh sửa nào, vui lòng để lại nhận xét bên dưới hoặc liên hệ với tôi qua tài khoản LinkedIn của tôi, Phạm Trung Huy.
Chúc bạn code vui vẻ 🍻
source: viblo