Contents
Chào bạn đến với Fx Studio. Chúng ta tiếp tục với vũ trụ RxSwift. Chủ đề lần này là Operators. Bài viết sẽ mở đầu cho mini-series với các nhóm toán tử trong RxSwift.
Vì sẽ liên quan nhiều tới các Observables & Subjects, nên bạn cần tìm hiểu 2 thực thể đó trước. Nếu bạn chưa biết thì có thể tham khảo 2 link sau:
Chuẩn bị
-
- Xcode 11
- Swift 5
- Playground
Vẫn là em Playground huyền thoại. Chúng ta vẫn còn dùng tới nó để demo code cho bài viết này. Bạn chỉ cần tạo mới 1 file Playground từ project mà đã cài đặt ngay từ bài đầu của series.
1. Khái niệm
1.1. Operators là gì?
Theo google thì
Operator là toán tử.
Chỉ đơn giản vậy thôi. Còn theo định nghĩa đầy đủ hơn thì như sau:
Operators là những phép toán cho phép biển đổi Observable thành Observable mới để phù hợp với nhu cầu sử dụng, chúng ta có thể tạo ra một chuỗi các phép toán để biến đổi observable.
Đây là phần tạo nên thương hiệu của RxSwift. Vì có quá nhiều các Operator tới mức mà không thể nào nhớ hết nỗi. Đôi khi quên & nhầm nữa.
1.2. Đặc tính cơ bản của Operators
Về các Operator thì ý nghĩa quan trọng nhất của chúng là:
- Biến đổi dữ liệu này thành một dữ liệu khác.
- Biến đổi cả 1 sequence observable thành 1 sequence observable khác.
- Handle các sự kiện.
- Thực thiện một số chức năng đặc biệt.
Điều đặc biệt nữa là:
- Bạn có thể gọi các Operator liên tiếp nhau.
- Đầu ra của Operator này là đầu vào của Operator khác.
Chính vì những cái đặc biệt đó mà giúp cho RxSwift trở nên khó hiểu cực kì.
2. Các nhóm Operators
Phân loại các Operators trong RxSwift thì thôi rồi tổ quốc ta ơi!
Có rất nhiều toán tử, chúng có thể thuộc về Rx chung hay các ReactiveX của từng ngôn ngữ (như RxSwift) & từng nền tảng (như RxCocoa). Tạm thời theo tìm hiểu sơ lược, thì mình tổng hợp có các loại sau đây:
- Creating Observables: gồm các phép toán dùng để khởi tạo observable.
- Transforming Observables: gồm các phép toán dùng để biến đổi các giá trị được phát ra bởi observable.
- Filtering Observables: gồm các phép toán dùng để chọn lọc các giá trị được phát ra bởi observable.
- Combining Observables: gồm các phép toán dùng để nhóm nhiều observables lại thành một observable.
- Error Handling Operators: gồm các phép toán dùng để thông báo lỗi từ observable.
- Observable Utility Operators: gồm các ultility hữu ích.
- Conditional and Boolean Operators: gồm các phép toán điều kiện.
- Mathematical and Aggregate Operators: gồm các phép toán tính toán số lượng các giá trị được phát ra.
- Connectable Observable Operators: gồm các phép toán có khả năng connect được observable.
- Operators to Convert Observables: gồm các phép toán dùng để convert observable thành object hoặc data structure.
Vâng vâng và mây mây … một bài viết không thể nào bao quát hết được các Operator. Do đó, mình phân chia chúng theo chức năng sử dụng. Và chia thành 4 nhóm chính.
Chi tiết từng nhóm Operator sẽ được đề cập trong các bài viết tiếp theo.
Việc phân nhóm này cũng dựa trên các tài liệu & sách về RxSwift và các tutorial trên mạng.
3. Hello world!
3.1. Xử lý dữ liệu
Bạn hãy tạo 1 Playground nữa trong project huyền thoại từ đầu series nha. Chúng ta sẽ bắt đầu với đoạn code sau:
let bag = DisposeBag() let hello = Observable.from(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]) hello .subscribe(onNext: { value in print(value) }, onError: { error in print(error) }, onCompleted: { print("Completed") }) { print("Disposed") } .disposed(by: bag)
Toàn bộ code cũng không có gì mới hết. Bạn có 1 Observable với kiểu là Observable<String>
. Sau đó, bạn subscribe
để nhận được các giá trị do hello
phát đi.
Bắt đầu với một Operator đơn giản nào.
helloObservable .reduce("", accumulator: +) .subscribe(onNext: { value in print(value) }, onError: { error in print(error) }, onCompleted: { print("Completed") }) { print("Disposed") } .disposed(by: bag)
Với reduce
là toán tử giúp bạn thu gọn lại toàn bộ các phần tử được phát đi. Để nhận được một giá trị duy nhất. Và khi bạn thực thi đoạn code thì sẽ nhận được một kết quả duy nhất mà thôi.
Bạn thử thay reduce
bằng scan
, bạn sẽ thấy nhận được giá trị lần lượt phát đi và thấy được sự hình thành của chuỗi cuối cùng.
01 012 0123 01234 012345 0123456 01234567 012345678 0123456789 Completed Disposed
3.2. Biến đổi kiểu dữ liệu
Bạn xem tiếp ví dụ sau:
let bag = DisposeBag() let hello = Observable.from(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]) hello .map { Int($0) } .subscribe(onNext: { value in print(value!) }, onError: { error in print(error) }, onCompleted: { print("Completed") }) { print("Disposed") } .disposed(by: bag)
Vẫn là Observable trên, lần này ta sử dụng toán tử map
. Một trong những toán tử điển hình cho việc biến đổi kiểu dữ liệu.
Đầu tiên bạn có 1 Observable<String>
thành 1 Observable<Int?>
bằng toán tử map
. Khi tiến hình subscribe
thì bạn sẽ thấy value
có kiểu là Int?
.
3.3. Sử dụng các toán tử liên tiếp nhau
Tiếp tục, bạn edit đoạn code ví dụ trên như sau:
let bag = DisposeBag() let hello = Observable.from(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]) hello .map { string -> Int in Int(string) ?? 0 } .filter { $0 % 2 == 0 } .subscribe(onNext: { value in print(value) }, onError: { error in print(error) }, onCompleted: { print("Completed") }) { print("Disposed") } .disposed(by: bag)
Bạn dùng tới 2 toán tử:
map
biến đổiString
thànhInt
. Nếu có lỗi gì đó thì sẽ thay bằng giá trị là0
filter
với điều kiện chia hết cho 2. Nên sẽ lọc ra được các phần tử chẵn của chuỗi số đã phát đi.
Do đó, đầu ra của map
chính là đầu vào của filter
. Tuỳ thuộc và logic của bạn, mà bạn có thể sử dụng nhiều toán tử để đạt được mục đích của mình.
Với 3 ví dụ trên, mình xin kết thúc bài viết này tại đây. Hẹn gặp lại bạn ở các bài viết chi tiết hơn về các Operator. Bạn có thể checkout code ví dụ tại đây. Nếu có gì thắc mắc hay góp ý cho mình thì bạn có thể để lại bình luận hoặc gởi email theo trang Contact.
Tạm kết
- Định nghĩa Operator
- Đặc điểm cơ bản của các Operator
- Các nhóm Operator
- Các ví dụ cơ bản cho các đặc điểm trên của Operator
Cảm ơn bạn đã đọc bài viết này!
Related Posts:
Written by chuotfx
Hãy ngồi xuống, uống miếng bánh và ăn miếng trà. Chúng ta cùng nhau đàm đạo về đời, về code nhóe!
Leave a Reply Cancel reply
Fan page
Tags
Recent Posts
- Charles Proxy – Phần 1 : Giới thiệu, cài đặt và cấu hình
- Complete Concurrency với Swift 6
- 300 Bài code thiếu nhi bằng Python – Ebook
- Builder Pattern trong 10 phút
- Observer Pattern trong 10 phút
- Memento Pattern trong 10 phút
- Strategy Pattern trong 10 phút
- Automatic Reference Counting (ARC) trong 10 phút
- Autoresizing Masks trong 10 phút
- Regular Expression (Regex) trong Swift
You may also like:
Archives
- September 2024 (1)
- July 2024 (1)
- June 2024 (1)
- May 2024 (4)
- April 2024 (2)
- March 2024 (5)
- January 2024 (4)
- February 2023 (1)
- January 2023 (2)
- November 2022 (2)
- October 2022 (1)
- September 2022 (5)
- August 2022 (6)
- July 2022 (7)
- June 2022 (8)
- May 2022 (5)
- April 2022 (1)
- March 2022 (3)
- February 2022 (5)
- January 2022 (4)
- December 2021 (6)
- November 2021 (8)
- October 2021 (8)
- September 2021 (8)
- August 2021 (8)
- July 2021 (9)
- June 2021 (8)
- May 2021 (7)
- April 2021 (11)
- March 2021 (12)
- February 2021 (3)
- January 2021 (3)
- December 2020 (3)
- November 2020 (9)
- October 2020 (7)
- September 2020 (17)
- August 2020 (1)
- July 2020 (3)
- June 2020 (1)
- May 2020 (2)
- April 2020 (3)
- March 2020 (20)
- February 2020 (5)
- January 2020 (2)
- December 2019 (12)
- November 2019 (12)
- October 2019 (19)
- September 2019 (17)
- August 2019 (10)