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