Khám Phá Các Toán Tử Lọc Trong RxSwift
RxSwift là thư viện mạnh mẽ cho lập trình phản ứng trên iOS và macOS. Một trong những chức năng quan trọng của RxSwift chính là khả năng lọc các luồng sự kiện thông qua các toán tử lọc. Các toán tử này giúp lập trình viên kiểm soát và xử lý các sự kiện một cách tinh vi hơn.
1. Toán Tử filter
Toán tử filter
cho phép chỉ các phần tử thỏa mãn một điều kiện nhất định đi qua.
swift
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
Trong ví dụ này, dòng lệnh numbers.filter { $0 % 2 == 0 }
chỉ phát ra các số chẵn từ dãy số 1 đến 6.
2. Toán Tử distinctUntilChanged
Toán tử này phát ra phần tử chỉ khi phần tử đó khác phần tử ngay trước đó.
swift
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 các số khác nhau lần lượt trong chuỗi.
3. Toán Tử 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.
swift
let numbers = Observable.of(1, 2, 3, 4, 5)
numbers.take(3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
// Output: 1, 2, 3
Dòng lệnh numbers.take(3)
chỉ phát ra ba phần tử đầu tiên từ dãy số.
4. Toán Tử takeLast
Toán tử takeLast
chỉ phát ra một số lượng nhất định từ cuối của luồng.
swift
let numbers = Observable.of(1, 2, 3, 4, 5)
numbers.takeLast(2)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
// Output: 4, 5
Dòng lệnh numbers.takeLast(2)
chỉ phát ra hai phần tử cuối cùng trong chuỗi.
5. Toán Tử 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.
swift
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
Dòng lệnh numbers.skip(2)
bỏ qua hai phần tử đầu tiên và phát ra các phần tử còn lại.
6. Toán Tử skipWhile
Toán tử skipWhile
bỏ qua các phần tử cho đến khi điều kiện không còn thỏa mãn nữa.
swift
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:
3
4
5
Dòng lệnh numbers.skipWhile { $0 < 3 }
bỏ qua các phần tử cho đến khi gặp công cụ không nhỏ hơn 3.
7. Toán Tử 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.
swift
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
Dòng lệnh numbers.takeWhile { $0 < 4 }
phát ra các số từ đầu cho đến khi gặp số không nhỏ hơn 4.
8. Toán Tử elementAt
Toán tử elementAt
phát ra phần tử ở vị trí chỉ định trong luồng.
swift
let numbers = Observable.of(1, 2, 3, 4, 5)
numbers.elementAt(2)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
// Output: 3
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. Toán Tử ignoreElements
Toán tử ignoreElements
bỏ qua tất cả các phần tử và chỉ phát ra các sự kiện kết thúc (completed
hoặc error
).
swift
let numbers = Observable.of(1, 2, 3, 4, 5)
numbers.ignoreElements()
.subscribe { event in
print(event)
}
.disposed(by: disposeBag)
// Output: completed
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 là công cụ hữu ích giúp lập trình viên kiểm soát và xử lý các luồng sự kiện hiệu quả. Sự hiểu biết và áp dụng đúng cách các toán tử này không chỉ giúp mã nguồn dễ theo dõi, mà còn tăng khả năng quản lý và bảo trì ứng dụng. Hãy thử nghiệm kết hợp các toán tử này trong 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ể.
source: viblo