07/09/2018, 17:05

RxSwift: Bài 2 - Subscribing to observables

RxSwift: Bài 2 - Subscribing to observables 1. Khái niệm Subscribe (đăng kí) đến một RxSwift observable khá giống như NotificationCenter, thay vì addObserver(), ta dùng subscribe(). Không giống như NotificationCenter, cái mà ta hay dùng .default như là 1 singleton instance, mỗi observable ...

RxSwift: Bài 2 - Subscribing to observables

1. Khái niệm

Subscribe (đăng kí) đến một RxSwift observable khá giống như NotificationCenter, thay vì addObserver(), ta dùng subscribe(). Không giống như NotificationCenter, cái mà ta hay dùng .default như là 1 singleton instance, mỗi observable trong Rx là khác nhau.

Quan trọng nhất, 1 observable sẽ không phát ra events cho đến khi có ai đó subscribe nó. Theo cách hiểu của mình, ta có thể giải thích vấn đề này như sau:
Định nghĩa của observable là 1 sequence, do đó việc subscribe đến 1 observable giống như việc mình gọi next() trong Iterator trong thư việc Swift chuẩn.

Tuy nhiên, subscribe đến observables được sắp xếp hợp lí hơn. Bạn cũng có thể thêm các handlers cho mỗi loại Event mà observable emit ra (bao gồm .next, .error và .completed). Một sự kiện .next sễ gửi đến 1 element hợp lệ đến handlers, và 1 .error sẽ chứa một error instance.

2. Các ví dụ:
a. Tất cả Event
Trong bài một ta có 1 loạt các observable, bây giờ ta chọn observable1 để subscribes, observable1 có dạng như sau:
let observable1: Observable = Observable.of(one, two, three)

alt text

Kết quả là:
alt text

Ta phân tích kĩ một chút về subscribe, Option-click nó, bạn sẽ thấy như sau:
alt text

Nó nhận 1 escaping closure mà lấy 1 Event kiểu Int, closure này ko trả về gì cả. Và hàm này trả về 1 Disposable. Cái disposable này mình sẽ nói đến ở bài 3. Như bạn thấy result trả về, nó có 3 lần onNext được gọi là, sau đó là onCompleted và rồi xong, kết thúc.

b. Event onNext
Ta tiếp tục subscribe nó tiếp như sau:
alt text

Event có 1 element property, đây là một giá trị optional, bởi vì chỉ có mỗi .next mới có element, cho nên bạn cần binding unwrap cái này nếu nó không nil. Bây giờ thì kết quả sẽ là

1
2
3

Chỉ có mình nội dung của element xuất hiện, không còn next(1) hay không còn .completed event nữa (bởi vì completed ko có element như đã nói ở trên). Tuyệt.

Rx cung cấp một subscribe operator giúp cho ta lấy được hẳn element mà không cần phải unwrap các kiểu. Đó là onNext.

alt text

Kết quả vẫn y như vậy

1
2
3

Với onNext bạn chỉ cần xử lý .next event mà không cần để ý cái gì khác.

c. empty operator

Cái empty operator sẽ tạo ra một empty observable sequence mà không có bất kì elements nào hết, do đó nó chỉ phát ra .completed event.

alt text

Đối với empty operator này, observable phải được định nghĩa một cách rõ ràng, nếu không nó sẽ không thể tự biết được. Và empty thì không có gì cả, nên trong trường hợp này, Void cũng chả khác gì các type khác.

Ở code trên, ta đã:

  1. Handle .next event như phía trên
  2. Print message ra trong .completed, bởi vì nó ko có bất kì elements nào hết. Và đây là kết quả: --- Example of: Void --- Completed Bạn thấy đấy, chỉ emit mỗi .completed. Nhưng mà empty observable này để dùng làm gì? Thực ra mình chưa gặp, theo lý thuyết nó được dùng khi mà ta muốn tạo 1 observable mà dừng ngay lập tức hay cố tình tạo 1 observable không có giá trị.

d. never operator
Never Operator này sẽ không có phát ra bất kì cái gì cả và cũng không kết thúc. Nó được sử dụng để đại diện cho 1 infinite duration. Thực ra mình cũng chưa gặp cái này lần nào. Và mình có một thắc mắc là nó ko print ra cái gì cả thì liệu làm sao mình kiểm tra nó có tồn tại hay không ?
alt text

e. Range of value
RxSwift còn có thể tạo ra 1 observable từ một khoảng các giá trị. Xem ví dụ sau:
alt text

Ta phân tích như sau:

  • Tạo ra 1 observable mà sử dụng range operator, nó sẽ bắt đầu lấy giá trị đầu tiên và bắt đầu tiếp một chuỗi tuần tự các số integer tiếp theo để generate ra.
  • Tính toán và emit ra chuỗi fibo cho mỗi phần tử

Cho đến lúc này, ta đã làm việc với các observables mà tự động gọi .completed event và được kết thúc êm đẹp. Trong thực tế lại không được như vậy. Do đó ta cần handle việc dừng subscribe này bằng một cách khác. Gọi là disposable, ta sẽ tìm hiểu ở bài 3.

0