RxSwift: Bài 4 - Subjects (Part 3) - Variables
RxSwift: Bài 4 - Subjects (Part 3) - Variables 1. Giới thiệu: Như để cập ở Part 1, 1 Variable có các tính chất của BehaviorSubject và lưu trữ giữ liệu hiện tại của nó như là trạng thái hiện tại của nó. Bạn có thể truy cập giá trị hiện tại này thông qua property "value" của nó. Và bạn cũng ...
RxSwift: Bài 4 - Subjects (Part 3) - Variables
1. Giới thiệu:
Như để cập ở Part 1, 1 Variable có các tính chất của BehaviorSubject và lưu trữ giữ liệu hiện tại của nó như là trạng thái hiện tại của nó.
Bạn có thể truy cập giá trị hiện tại này thông qua property "value" của nó. Và bạn cũng có thể sử dụng cái "value" này để nhập những element lên trên variable của nó. Nói cách khác, bạn không dùng onNext(_:).
Bởi vì nó có các tính chất của BehaviorSubject nên 1 Variable được tạo ra với 1 giá trị khởi tạo, và nó sẽ phát ra giá trị mới nhất hoặc giá trị ban đầu đến những subscribers mới của nó. Để truy cập vào 1 behavior subject bên dưới của Variable, bạn gọi asObservable() lên nó
Một tính chất khá đặc trưng của Variable so với những subject khác đó là nó được đảm bảo rằng sẽ không phát ra Error. Mặc dù bạn có thể lắng nghe .error events trong 1 subscription đến 1 variable, nhưng bạn không thể add 1 .error event lên trên 1 Variable. Ngoài ra, một variable cũng sẽ tự động kết thúc khi nó chuẩn bị deallocated, cho nên bạn không thể add .completed event vào nó.
2. Ví dụ cụ thể
Bạn xem dòng code sau:
Mình xin phân tích như sau:
1.Tạo 1 Variable với 1 giá trị khởi tạo. Variable có thể tự suy luận kiểu thông qua giá trị ban đầu nhưng bạn cũng có thể khai rõ ràng loại là gì, ví dụ như là Variable("Initial value").
2.Add một giá trị cho nó, là "new init value", bạn lưu ý các add lần này không còn add qua onNext nữa mà là add thông qua cái value.
3.Subscribe đến cái variable này bằng cách gọi asObservable() để truy cập vào behavior subject nằm bên trong của nó.
Kết quả như hình dưới, nó sẽ lấy giá trị mới nhất của nó:
--- Example of: Variable --- 1) New initial value
Bây giờ ta add thêm đoạn code sau vào chỗ tiếp theo:
Phân tích một chút:
1.Ta add thêm giá trị mới vào variable.
2.Tạo thêm 1 subscription đến thằng variable này.
3.Add thêm một giá trị khác vào variable này.
Kết quả như sau:
Các bạn có đoạn được tại sao không? Cho các bạn 5p suy nghĩ, hết giờ. Bây giờ mình xin giải thích như sau.
Cái subscription hiện tại Sub01 nhận giá trị mới 1 từ Variable, không có gì khó hiểu vì nó đã subscribe nãy giờ. Còn đối với Sub02, nó vẫn nhận giá trị tương tự bởi vì đó là giá trị gần nhất. Sau đó cả hai đều nhận được giá trị 2, khi giá trị 2 này đã được add vào value của nó.
Không có cách nào để add .error hay .completed event vào variable, dù có cố thì compiler cũng báo lỗi nên ta sẽ không làm thử việc này để làm gì. Đây là một vài cách chữa cháy:
// These will all generate errors variable.value.onError(MyError.anError) variable.asObservable().onError(MyError.anError) variable.value = MyError.anError variable.value.onCompleted() variable.asObservable().onCompleted()
Variables rất linh hoạt. Bạn có thể subscribe chúng như là observables để có thể react bất cứ khi nào có 1 new .next event xuất hiện, giống như các subject khác. Chúng còn có thể đáp ứng nhu cầu dùng lần rồi thôi như là khi bạn chỉ cần check giá trị hiện tại là đủ mà không cần phải subscribe gì cho phức tạp.