RxSwift: Bài 2 - Subscribing to observables
swift
68
RxSwift
20
ios
54
Male avatar

Bùi Khánh Duy viết ngày 30/06/2018

RxSwift: Bài 2 - Subscribing to observables

=====
Updated ngày 30/06

Updated một chút: Vì những bất tiện và không rõ ràng về thông tin của kipalog, mình mới dọn về nhà mới ở đây, thoải mái, đẹp đẽ rõ ràng hơn kipalog. Mong các bạn có thể theo dõi tại trang web của mình để cập nhật thêm nha

Mình mới viết một loạt bài về chủ đề Clean Architecture và Service Locator. Các bạn có thể theo dõi.
Page trên facebook ở đây: ở đây

=====
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ó

Update: Chỗ này mình xin update 1 chút, 1 cold observable sẽ không phát ra events cho đến khi có ai đó subscribe nó. Và hot và cold observable là gì? Các bạn tìm hiểu thêm ở đây.

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

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

Male avatar

Bùi Khánh Duy

29 bài viết.
11 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
Male avatar
4 0
Autolayout và lifecycle trong IOS ===== Updated ngày 30/06 Updated một chút: Vì những bất tiện và không rõ ràng về thông tin của kipalog, mình mớ...
Bùi Khánh Duy viết 4 tháng trước
4 0
Male avatar
3 3
RxSwift: Bài 1 Observable và Just, Of, From ===== Updated ngày 30/06 Updated một chút: Vì những bất tiện và không rõ ràng về thông tin của kipalo...
Bùi Khánh Duy viết 6 tháng trước
3 3
Male avatar
2 0
RxSwift: Bài 3 Disposing and terminating ===== Updated ngày 30/06 Updated một chút: Vì những bất tiện và không rõ ràng về thông tin của kipalog, ...
Bùi Khánh Duy viết 6 tháng trước
2 0
Bài viết liên quan
Male avatar
0 0
RxSwift: Bài 6: RxCocoa (Part 4) Units ===== Updated ngày 30/06 Updated một chút: Vì những bất tiện và không rõ ràng về thông tin của kipalog, mì...
Bùi Khánh Duy viết 6 tháng trước
0 0
Male avatar
0 0
RxSwift: Bài 6: RxCocoa (Part 5) Disposing with RxCocoa ===== Updated ngày 30/06 Updated một chút: Vì những bất tiện và không rõ ràng về thông t...
Bùi Khánh Duy viết 6 tháng trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


Male avatar
{{userFollowed ? 'Following' : 'Follow'}}
29 bài viết.
11 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!