RxSwift – Các Toán Tử Kết Hợp
1. Các Toán Tử Tiền Tố và Nối Kết
1.1. startWith
Toán tử startWith
cho phép bạn thêm một hoặc nhiều phần tử vào trước khi Observable bắt đầu phát dữ liệu. Ví dụ:
swift
let bag = DisposeBag()
Observable.of("B", "C", "D", "E")
.startWith("A")
.subscribe(onNext: { value in
print(value)
})
.disposed(by: bag)
Kết quả sẽ là:
A
B
C
D
E
1.2. Observable.concat
Toán tử concat
được sử dụng để nối các phần tử của nhiều Observable lại với nhau. Ví dụ:
swift
let bag = DisposeBag()
let first = Observable.of(1, 2, 3)
let second = Observable.of(4, 5, 6)
let observable = Observable.concat([first, second])
observable
.subscribe(onNext: { value in
print(value)
})
.disposed(by: bag)
Kết quả:
1
2
3
4
5
6
1.3. concatMap
Toán tử concatMap
cho phép bạn chuyển đổi Observable thành Observable khác và kết hợp giá trị phát ra.
swift
let bag = DisposeBag()
let cities = [ "Mien Bac" : Observable.of("Ha Noi", "Hai Phong"),
"Mien Trung" : Observable.of("Hue", "Da Nang"),
"Mien Nam" : Observable.of("Ho Chi Minh", "Can Tho")]
let observable = Observable.of("Mien Bac", "Mien Trung", "Mien Nam")
.concatMap { name in
cities[name] ?? .empty()
}
observable
.subscribe(onNext: { (value) in
print(value)
})
.disposed(by: bag)
Kết quả ra như sau:
Ha Noi
Hai Phong
Hue
Da Nang
Ho Chi Minh
Can Tho
2. Kết Hợp Dữ Liệu
2.1. merge
Toán tử merge
tạo ra một Observable mới và không quan tâm đến thứ tự các Observable phát đi dữ liệu.
swift
let bag = DisposeBag()
let chu = PublishSubject<String>()
let so = PublishSubject<String>()
let source = Observable.of(chu.asObserver(), so.asObserver())
let observable = source.merge()
observable
.subscribe(onNext: { (value) in
print(value)
})
.disposed(by: bag)
Kết quả sẽ như sau:
Một
1
Hai
2
Ba
Bốn
2.2. combineLatest
Toán tử combineLatest
phát đi giá trị là sự kết hợp mới nhất của các Observable. Ví dụ:
swift
let chu = PublishSubject<String>()
let so = PublishSubject<String>()
let observable = Observable.combineLatest(chu, so)
observable
.subscribe(onNext: { (value) in
print(value)
})
.disposed(by: bag)
Khi phát dữ liệu:
chu.onNext("Một")
so.onNext("1")
chu.onNext("Hai")
so.onNext("2")
Kết quả:
(\"Hai\", \"1\")
(\"Hai\", \"2\")
2.3. zip
zip
cho phép bạn kết hợp các giá trị phát đi theo thứ tự. Ví dụ:
swift
let observable = Observable.zip(chu, so) { chu, so in
"\(chu) : \(so)"
}
Kết quả:
Một : 1
Hai : 2
3. Các Toán Tử Kích Hoạt
3.1. withLatestFrom
Toán tử này kết hợp giá trị từ một Observable dựa vào giá trị mới nhất từ Observable khác. Ví dụ:
swift
let button = PublishSubject<Int>()
let textField = PublishSubject<String>()
let observable = button.withLatestFrom(textField) { button, textfield in
"\(button) : \(textfield)"
}
Kết quả có thể nhận:
1 : Đa
2 : Đà Na
3.2. sample
sample
chỉ phát giá trị khi Observable khác phát ra. Ví dụ:
swift
let observable = button.sample(textField)
4. Kết Hợp Nguồn Dữ Liệu
4.1. amb
Toán tử amb
cho phép bạn chọn một nguồn dữ liệu, nguồn nào phát trước sẽ được chọn. Ví dụ:
swift
let observable = chu.amb(so)
4.2. switchLatest
Toán tử này cho phép chuyển đổi qua lại giữa nhiều Observable, giá trị sẽ được nhận từ Observable kích hoạt gần đây nhất.
swift
let observable = PublishSubject<Observable<String>>()
observable.switchLatest().subscribe(onNext: { (value) in
print(value)
})
Kết quả thu được sẽ từ Observable hiện tại mà bạn chuyển đổi qua.
5. Kết Hợp Các Phần Tử Trong Một Chuỗi
5.1. reduce
Toán tử này giúp bạn tính toán giá trị cuối cùng sau khi một Observable phát dữ liệu:
swift
let observable = source.reduce(0, accumulator: +)
5.2. scan
Khác với reduce
, scan
sẽ phát đi giá trị tính toán ngay lập tức sau khi có dữ liệu, không chờ Observable hoàn thành:
swift
let observable = source.scan(0, accumulator: +)
Kết quả:
1
3
6
10
15
21
28
36
45
Hy vọng với những kiến thức này, bạn sẽ dễ dàng hơn trong việc áp dụng các toán tử kết hợp trong RxSwift để xử lý và kết hợp dữ liệu trong ứng dụng của mình.
source: viblo