RxSwift 9: Subjects

606

Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh

Trong bài 8, chúng ta đã biết cách tạo 1 observable factory, biết cách tạo nhiều loại observable khác nhau cho các subscribers.

Từ 8 bài, bạn đã nắm chắc được 1 observable là gì, cách tạo ra nó, cách đăng ký tới nó, và giải phóng khi nó hoàn thành. Observables là 1 phần cơ bản của RxSwift, nhưng nhu cầu cơ bản của phát triển ứng dụng là thêm thủ công các giá trị tới observable trong thời gian thực, sau đó gửi(emited) tới các subscribers. Những gì bạn muốn đồng thời là observable và observer. Và thứ đó được gọi là Subjects.

  10 theme Sublime Text tốt nhất
  Cách thiết lập một dự án Symfony để làm việc với Docker Subdomains

Trong bài này, chúng ta sẽ tìm hiểu sự khác nhau giữa các loại subject, cách nó làm việc và dùng nó trong trường hợp cụ thể nào.

Để bắt đầu, chúng ta tạo đoạn code thử nghiệm sau:

example(of: "PublishSubject") {
  let subject = PublishSubject<String>()    
}

Các bạn có thể tải code tham khảo tại:

https://github.com/lexuanquynh/RxLearning/tree/master/RxLearning/Playground/SubjectPlayground.playground

Trong đoạn code trên, chúng ta vừa tạo 1 PublishSubject. Giống như tên gọi, nó sẽ nhận các thông tin sau đó chuyển thông tin tới các subscribers, có thể sửa đổi thông tin trước khi chuyển. Nó thuộc kiểu String, vì vậy nó chỉ có thể gửi và nhận kiểu String. Sau khi được khởi tạo, nó sẵn sàng gửi và nhận String.

Thêm tiếp đoạn code sau vào ví dụ trên:

subject.onNext("Co ai nghe tui noi khong?")

Chúng ta vừa đặt 1 string vào subject, tuy nhiên chưa in ra gì cả vì chưa có subscriber nào đăng ký. Để tạo 1 subscriber, chúng ta thêm tiếp đoạn code sau:

let subscriptionOne = subject
  .subscribe(onNext: { string in
    print(string)
  })

Bạn vừa tạo 1 subscriber, nhưng vẫn chưa có gì hiển thị cả. Chính xác là khi subscriptionOne tạo ra, thì thông điệp onNext đã gửi trước đó, cho nên nó sẽ không nhận được nữa. Bây giờ thử thêm tiếp đoạn code sau vào dưới chương trình:

subject.on(.next("1"))

Kết quả như sau:

--- Example of: PublishSubject ---
1

Vì subscriptionOne đã tạo, cho nên khi 1 string phát ra từ PublishSubject, nó sẽ nhận được và hiển thị ra màn hình.

Vậy Subjects là gì?

Subjects đóng vai trò vừa là observable và observer. Nó có thể nhận sự kiện và gửi nó tới subscribers. Như chúng ta thấy, nó nhận sự kiện ở onNext, và đồng thời gửi chúng tới các subscribers. Có 4 loại subjects thường thấy:

  1. PublishSubject: Khởi tạo rỗng, và chỉ phát các phần tử cho các subscriber đã đăng ký với nó.
  2. BehaviorSubject: Khởi tạo với 1 phần tử ban đầu, và phát các phần tử mới nhất cho các subscriber đã đăng ký với nó.
  3. ReplaySubject: Khởi tạo với 1 dãy phần tử ban đầu, và phát lại toàn bộ các phần tử đó cho các subscriber đăng ký tới nó.
  4. Variable: Wrap 1 BehaviorSubject, giữ nguyên giá trị hiện tại của nó dưới dạng trạng thái, và chỉ phát lại giá trị mới nhất/ ban đầu cho các subscribers đăng ký mới. (Lưu ý: dạng này đã không còn dùng trong các phiển bản Rxswift mới nữa).

Vậy các subjects hoạt động như nào, chúng ta hãy tiếp tục theo dõi bài 10 nhé!

Bài viết gốc được đăng tải tại codetoanbug.com

Có thể bạn quan tâm:

Xem thêm IT job hấp dẫn trên TopDev