0
0
Lập trình
Admin Team
Admin Teamtechmely

Giới thiệu về Combine trong iOS: Khám Phá Framework Xử Lý Dữ Liệu Theo Thời Gian

Đăng vào 3 tuần trước

• 4 phút đọc

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.

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

Copy
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

  1. 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).
  2. Đă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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.

Ví dụ sử dụng:

Copy
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 Copy
// 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 PublisherSubscriber, 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

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào