- vừa được xem lúc

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

0 0 13

Người đăng: Duy Nhất

Theo Viblo Asia

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

Bình luận

Bài viết tương tự

- vừa được xem lúc

Widgets trên iOS

Apple gần đây đã bắt đầu với hỗ trợ các widget cho iOS. Chúng cung cấp thông tin tối thiểu nhưng hữu ích cho người dùng mà không cần truy cập vào ứng dụng. Requirements. Đầu tiên, để bắt đầu với các widget, chúng ta cần có:.

0 0 29

- vừa được xem lúc

Tôi đã lạm dụng chính sách Referral của app X như nào? - Phần I

Trước hết, bài này là bài về kĩ thuật =))) Nhưng tản mạn hơi dài anh em cố đọc không thì kéo xuống dưới nhé. Lời nói đầu.

0 0 43

- vừa được xem lúc

Tổng hợp các câu hỏi phỏng vấn Android phần 1

Cứ code mãi cùng buồn, nên mình muốn ôn lại một chút kiến thức về Android, vừa là để ôn tập vừa là để ghi lại khi nào cần thì mở ra xem. Các câu hỏi thì mình cũng sẽ tổng hợp từ những bài viết khác nh

0 0 45

- vừa được xem lúc

Tập tành Custom View trong Android (Phần 1)

Anh em code Android chắc cũng biết Android platform cung cấp khá đa dạng nhiều loại View Classes để "fit" với từng loại dự án khác nhau. Tuy nhiên, sẽ có một số dự án đặc trưng đòi hỏi sự cải tiến hoặ

0 0 31

- vừa được xem lúc

Lưu trữ Dữ liệu trong Swift và iOS

Lưu trữ Dữ liệu trong Swift và iOS. .

0 0 12

- vừa được xem lúc

Cách dùng Animated trong React Native

Tổng quan. .

0 0 14