0
0
Lập trình
Admin Team
Admin Teamtechmely

Hướng Dẫn Sử Dụng Toán Tử Kết Hợp Trong RxSwift

Đăng vào 3 tuần trước

• 3 phút đọc

Chủ đề:

RxSwiftrxcocoa

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 Copy
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à:

Copy
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 Copy
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ả:

Copy
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 Copy
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:

Copy
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 Copy
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:

Copy
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 Copy
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:

Copy
chu.onNext("Một")
so.onNext("1")
chu.onNext("Hai")
so.onNext("2")

Kết quả:

Copy
(\"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 Copy
let observable = Observable.zip(chu, so) { chu, so in
    "\(chu) : \(so)"
}

Kết quả:

Copy
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 Copy
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:

Copy
1 : Đa
2 : Đà Na

3.2. sample

sample chỉ phát giá trị khi Observable khác phát ra. Ví dụ:

swift Copy
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 Copy
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 Copy
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 Copy
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 Copy
let observable = source.scan(0, accumulator: +)

Kết quả:

Copy
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

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào