+1

Giới thiệu về RxSwift và Toán tử Lọc (Filtering Operators)

Filtering Operators

RxSwift là một thư viện giúp lập trình phản ứng trong iOS và macOS. Một trong những tính năng mạnh mẽ của RxSwift là khả năng lọc các luồng sự kiện bằng các toán tử lọc. Các toán tử này giúp bạn kiểm soát và xử lý các sự kiện một cách tinh tế hơn.

1. filter

Toán tử filter chỉ cho phép các phần tử thỏa mãn một điều kiện nhất định đi qua.

let numbers = Observable.of(1, 2, 3, 4, 5, 6)
numbers.filter { $0 % 2 == 0 }
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
// Output: 2, 4, 6

Dòng lệnh numbers.filter { $0 % 2 == 0 } chỉ phát ra các số chẵn từ chuỗi số 1, 2, 3, 4, 5, 6.

2. distinctUntilChanged

Toán tử này phát ra phần tử chỉ khi phần tử đó khác với phần tử trước đó.

 let numbers = Observable.of(1, 2, 2, 3, 3, 3, 4)
numbers.distinctUntilChanged()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
// Output: 1, 2, 3, 4

Dòng lệnh numbers.distinctUntilChanged() chỉ phát ra số nếu nó khác với số ngay trước đó trong chuỗi.

3. take

Toán tử take chỉ phát ra một số lượng nhất định các phần tử từ đầu của luồng.

Bạn xem qua đoạn code sau

let numbers = Observable.of(1, 2, 3, 4, 5)
numbers.take(3)
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
// Output: 1, 2, 3

Giải thích:

  • Dòng lệnh numbers.take(3) chỉ phát ra ba phần tử đầu tiên từ chuỗi số.

4. takeLast

Toán tử takeLast chỉ phát ra một số lượng nhất định các phần tử từ cuối của luồng.

Demo code như sau

let numbers = Observable.of(1, 2, 3, 4, 5)
numbers.takeLast(2)
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
// Output: 4, 5

Giải thích:

  • Dòng lệnh numbers.takeLast(2) chỉ phát ra hai phần tử cuối cùng từ chuỗi số.

5. skip

Toán tử skip bỏ qua một số lượng nhất định các phần tử đầu tiên của luồng.

let numbers = Observable.of(1, 2, 3, 4, 5)
numbers.skip(2)
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

Kết quả thực thi như sau

3
4
5

Giải thích:

  • Dòng lệnh numbers.skip(2) bỏ qua hai phần tử đầu tiên và chỉ phát ra các phần tử còn lại

6. skipWhile

Toán tử skipWhile bỏ qua các phần tử cho đến khi một điều kiện không còn thỏa mãn nữa.

Code ví dụ demo như sau

 let numbers = Observable.of(1, 2, 3, 4, 5)
numbers.skipWhile { $0 < 3 }
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

Kết quả thực thi như sau

3
4
5

Giải thích:

  • Dòng lệnh numbers.skipWhile { $0 < 3 } bỏ qua các phần tử cho đến khi gặp phần tử không nhỏ hơn 3.

7. takeWhile

Toán tử takeWhile chỉ phát ra các phần tử cho đến khi một điều kiện không còn thỏa mãn nữa.

Code ví dụ như sau

let numbers = Observable.of(1, 2, 3, 4, 5)
numbers.takeWhile { $0 < 4 }
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

Kết quả thực thi

1
2
3

Giải thích:

  • Dòng lệnh numbers.takeWhile { $0 < 4 } phát ra các phần tử từ đầu cho đến khi gặp phần tử không nhỏ hơn 4.

8. elementAt

Toán tử elementAt chỉ phát ra phần tử ở vị trí chỉ định trong luồng.

let numbers = Observable.of(1, 2, 3, 4, 5)
numbers.elementAt(2)
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
// Output: 3

Giải thích:

  • Dòng lệnh numbers.elementAt(2) phát ra phần tử tại vị trí thứ 2 (index bắt đầu từ 0), tức là số 3.

9. ignoreElements

Toán tử ignoreElements bỏ qua tất cả các phần tử của luồng và chỉ phát ra các sự kiện kết thúc (completed hoặc error).

let numbers = Observable.of(1, 2, 3, 4, 5)
numbers.ignoreElements()
    .subscribe { event in
        print(event)
    }
    .disposed(by: disposeBag)
// Output: completed

Giải thích:

  • Dòng lệnh numbers.ignoreElements() không phát ra bất kỳ phần tử nào mà chỉ phát ra sự kiện completed khi luồng kết thúc.

Kết Luận

Các toán tử lọc trong RxSwift giúp bạn kiểm soát và xử lý các luồng sự kiện một cách hiệu quả. Hiểu và áp dụng đúng các toán tử này sẽ giúp mã nguồn của bạn trở nên rõ ràng và hiệu quả hơn, đồng thời tăng khả năng quản lý và bảo trì của ứng dụng. Hãy thử nghiệm và kết hợp các toán tử này trong các dự án của bạn để tìm ra giải pháp tối ưu cho từng tình huống cụ thể.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí