Skip to content
  • Home
  • Code
  • iOS & Swift
  • Combine
  • RxSwift
  • SwiftUI
  • Flutter & Dart
  • Tutorials
  • Art
  • Blog
Fx Studio
  • Home
  • Code
  • iOS & Swift
  • Combine
  • RxSwift
  • SwiftUI
  • Flutter & Dart
  • Tutorials
  • Art
  • Blog
Written by chuotfx on September 18, 2020

RxSwift – Tìm hiểu Operators & Hello world!

RxSwift

Contents

  • Chuẩn bị
  • 1. Khái niệm
    • 1.1. Operators là gì?
    • 1.2. Đặc tính cơ bản của Operators
  • 2. Các nhóm Operators
  • 3. Hello world!
    • 3.1. Xử lý dữ liệu
    • 3.2. Biến đổi kiểu dữ liệu
    • 3.3. Sử dụng các toán tử liên tiếp nhau
  • Tạm kết

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:

  • RxSwift – Observables
  • RxSwift – Hello Subjects

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.

  • Filtering Operators
  • Transforming Operators
  • Combining Operators
  • Time-Based Operators

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 đổi String thành Int. 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!

FacebookTweetPinYummlyLinkedInPrintEmailShares17

Related Posts:

  • Tìm hiểu về ngôn ngữ lập trình Dart
    Tìm hiểu về ngôn ngữ lập trình Dart
  • Hello Multiplatform App - SwiftUI Notes #22
    Hello Multiplatform App - SwiftUI Notes #22
  • Hello Testing iOS
    Hello Testing iOS
  • Hello world! - SwiftUI Notes #1
    Hello world! - SwiftUI Notes #1
Tags: rxswift
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

Your email address will not be published. Required fields are marked *

Donate – Buy me a coffee!

Fan page

Fx Studio

Tags

Actor Advanced Swift api AppDistribution Asynchronous autolayout basic ios tutorial blog callback ci/cd closure collectionview combine concurrency CoreData Core Location crashlytics darkmode dart dart basic dart tour Declarative decoding delegate deploy fabric fastlane firebase flavor flutter GCD iOS mapview MVVM optional protocol rxswift Swift Swift 5.5 SwiftUI SwiftUI Notes tableview testing TravisCI unittest

Recent Posts

  • Raw String trong 10 phút
  • Dispatch Semaphore trong 10 phút
  • Tổng kết năm 2022
  • KeyPath trong 10 phút – Swift
  • Make color App Flutter
  • Ứng dụng Flutter đầu tiên
  • Cài đặt Flutter SDK & Hello world
  • Coding Conventions – người hùng hay kẻ tội đồ?
  • Giới thiệu về Flutter
  • Tìm hiểu về ngôn ngữ lập trình Dart

You may also like:

  • RxSwift - Publish Subjects
    RxSwift - Publish Subjects
  • Hello Multiplatform App - SwiftUI Notes #22
    Hello Multiplatform App - SwiftUI Notes #22
  • Cài đặt Flutter SDK & Hello world
    Cài đặt Flutter SDK & Hello world
  • RxSwift - Filtering Operators
    RxSwift - Filtering Operators
  • RxSwift - Hello world!
    RxSwift - Hello world!

Archives

  • 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)

About me

Education, Mini Game, Digital Art & Life of coders
Contacts:
contacts@fxstudio.dev

Fx Studio

  • Home
  • About me
  • Contact us
  • Mail
  • Privacy Policy
  • Donate
  • Sitemap

Categories

  • Art (1)
  • Blog (22)
  • Code (4)
  • Combine (22)
  • Flutter & Dart (24)
  • iOS & Swift (86)
  • RxSwift (37)
  • SwiftUI (76)
  • Tutorials (70)

Newsletter

Stay up to date with our latest news and posts.
Loading

    Copyright © 2023 Fx Studio - All rights reserved.

    Share this ArticleLike this article? Email it to a friend!

    Email sent!