I. Giới thiệu
Một trong những điều quan trọng của lập trình hướng đối tượng (OOP) và hướng thủ tục đó là imperative (lập trình mệnh lệnh). Chúng ta cần sử dụng những câu lệnh để thay đổi trạng thái của chương trình.
Vậy câu hỏi đặt ra làm sao để trạng thái của chương trình có thể thay đổi một cách tự động, liệu ngôn ngữ, khái niệm lập trình nào làm được việc đó không ?
→ Câu trả lời đó là reactive programming.
Khi mà ứng dụng của bạn phản ứng lại với những thay đổi của data, reactive programming sẽ giúp chúng ta thực hiện điều đó. Nó giúp chúng ta tâp trung vào việc xử lí logic và không cần quan tâm tới việc thay đổi giữa các trạng thái (state) với nhau.
Chúng ta có thấy trong swift sử dụng KVO và didSet để thiết lập cho lập trình phản ứng (reactive), nhưng việc thiết lập cho dữ liệu lớn, hoặc bài toán phức tạp hơn khá rắc rối. Vậy nên chung ta sẽ dùng tới thư viện thứ 3 đó là RxSwift
Note*: “KVO là một khái niệm chúng ta sẽ gặp nhiều khi sử dụng SwiftUI, các bạn có thể search thêm về khái niệm này nhé.”
Thư viện RxSwift sẽ giúp chúng ta giải quyết vấn đề trên qua lập trình bất đồng bộ (asynchronous programming).
Để không tốn thời gian của các bạn mình sẽ đi nhanh qua các thành phần mà RxSwift cung cấp
II. Các thành thần (components) chính của RxSwift:
- Observable và Observer
- Subject
- DisposeBag
- Operators
- Schedules
Observable và Observer
Có rất nhiều thuật ngữ để mô tả cho lập trình bất đồng bộ, ở đâu mình sẽ sử dụng thuật ngữ observebal và Observer luôn nhé.
- Observer lắng nghe Observable.
- Observable phát ra các items hoặc gửi các notifications đến các Observer bằng cách gọi các Observer methods.
Khái niệm Observable đến từ observer design pattern là một đối tượng thông báo cho các đối tượng theo dõi về một điều gì đó đang diễn ra
• Một Observer đăng ký lắng nghe một Observable, sau đó nó sẽ xử lý một item hoặc nhiều các item mà Observable phát ra.
Chúng ta có thể đăng kí tới một Observable sequence thông qua subscribe(on:(Event<T>)->()).
Trong RxSwift một sự kiện sẽ chỉ là một trong Enumeration Type với 3 trạng thái có thể xảy ra:
.onNext(value: T) -> Observable gọi hàm onNext có tham số là item, item này là một trong các tập items của Observable
.onError(error: Error) -> Được gọi khi Observable kết thúc với một lỗi xảy ra trong quá trình chuyển đổi, xử lý dữ liệu.
.onCompleted -> Observable gọi hàm này sau khi hàm onNext cuối cùng được gọi, nếu không có bất kì lỗi nào xảy ra.
Ví dụ với code Swift:
let obj = Observable.from(["A", "B", "C", "D"]) // Khởi tạo một Observable
obj.subscribe( // Thực hiện subscribe Observable
onNext: { data in
print(data) // Nơi nhận dữ liệu của Observer được gửi đi từ Observable
},
onError: { error in
print(error) // Nơi nhận error và Observable được giải phóng
},
onCompleted: {
print("Completed") // Nhận được sự kiện khi Observable hoàn thành và Observable được giải phóng
})
.disposed()
Kết quả trả về:
A
B
C
D
Competed
Subject
Một đối tượng vừa có thể là Observable vừa có thể là Observer được gọi là Subject.
Trong RxSwift cung cấp cho chúng ta 4 subject khác nhau với cách thứ hoạt động khác nhau đó là:
- PublishSubject: Khởi đầu “empty” và chỉ emit các element mới cho subscriber của nó.
- BehaviorSubject: Khởi đầu với một giá trí khởi tạo và sẽ relay lại element cuối cùng của chuỗi cho Subscriber mới.
- ReplaySubject: Khởi tạo với một kích thước bộ đệm cố định, sau đó sẽ lưu trữ các element gần nhất vào bộ đệm này và relay lại các element chứa trong bộ đệm cho một Subscriber mới.
- BehaviourReplay (which was Variable): Lưu trữ một giá trị như một state và sẽ relay duy nhất giá trị cuối cùng cho Subscriber mới.
Để đi sâu vào từng loại subject mà RxSwift cung cấp khá là dài, nên mình chỉ lướt qua. Các bạn có thể tìm hiểu thêm, hoặc chờ một bài viết viết của mình đi sâu phân tích các subject trên nhé!
Ở phần 1 mình đã giới thiệu qua khái niệm Reactive Programing, và một số thành phần chính của nó là Observabel và Observer, Subject.
Các phần tiếp theo mình sẽ gửi tới các bạn ở phần 2 nhé.
Cảm ơn các bạn đã đọc bài viết của mình.
CongPQ