1. Khái niệm
Relay là thành phần mới được thêm vào RxSwift. Đi kèm với đó là khai tử đi Variable , một trong nhưng Class sử dụng rất nhiều trong các project với RxSwift.
Thứ nhất, Relay là một wraps cho một subject. Tuy nhiên, nó không giống như các subject hay các observable chung chung. Ở một số đặc điểm sau:
-
Không có hàm
.onNext(_:)
để phát đi dữ liệu -
Dữ liệu được phát đi bằng cách sử dụng hàm
.accept(_:)
-
Chúng sẽ không bao giờ .error hay .completed Ta có 2 loại Relay:
-
PublishRelay đó là warp của PublishSubject. Relay này mang đặc tính của PublishSubject
-
BehaviorRelay đó là warp của BehaviorSubject. Nó sẽ mang các đặc tính của subject này
2. Publish Relays
Create
import RxCocoa // dispose let disposeBag = DisposeBag() // error define enum MyError: Error { case anError } // relay let publishRelay = PublishRelay<String>()
Bạn sẽ có một đối tượng publishRelay thuộc class PublishRelay. Việc khởi tạo thì không cần cung cấp giá trị nào hết. Bạn cần phải cung cấp kiểu dữ liệu cho các phần tử được phát đi, trong trường hợp này là String.
Emit
publishRelay.accept("0")
Lần này, sẽ khác cách Subject emit dữ liệu đi. Bạn sử dụng .accept thay cho .onNext.
Subscribe
// subcribe 1 publishRelay .subscribe { print("🔵 ", $0) } .disposed(by: disposeBag) // emits publishRelay.accept("1") publishRelay.accept("2") publishRelay.accept("3") // subcribe 2 publishRelay .subscribe { print("🔴 ", $0) } .disposed(by: disposeBag) // emit publishRelay.accept("4")
Output:
🔵 next(1)
🔵 next(2)
🔵 next(3)
🔵 next(4)
🔴 next(4)
Vẫn là function .subcribe()
để đăng ký tới 1 Relay. Trong ví dụ này, subscriber sẽ nhận được các giá trị mới sau khi nó đăng ký. Còn subscribe2, chỉ nhận được giá trị 4 thôi.
Terminate
Bạn không thể kết thúc Relay được, vì chúng không hề phát đi error hay completed. Việc phát đi error & completed thì đều bị trình biên dịch ngăn cản.
let test1 = publishRelay .subscribe { print("test1 ", $0) } // emits publishRelay.accept("1") publishRelay.accept("2") test1.dispose() publishRelay.accept("3")
Tương tự như Publish Subjects
, khi subscribe gọi .dispose()
thì cũng sẽ thì sẽ không nhận được các giá trị mà subject phát tiếp.
3. Behavior Relays
Create
let behaviorRelay = BehaviorRelay<String>(value: "0")
Class tạo ra 1 Relay này là BehaviorRelay. Tương tự, bạn phải cung cấp một giá trị cho value để làm giá trị khởi tạo ban đầu cho Relay này.
Emit
behaviorRelay.accept("0")
Subscribe
// subcribe 1 behaviorRelay .subscribe { print("🔵 ", $0) } .disposed(by: disposeBag) behaviorRelay.accept("1") behaviorRelay.accept("2") behaviorRelay.accept("3") // subcribe 2 behaviorRelay .subscribe { print("🔴 ", $0) } .disposed(by: disposeBag) behaviorRelay.accept("4")
Output:
🔵 next(0)
🔵 next(1)
🔵 next(2)
🔵 next(3)
🔴 next(3)
🔵 next(4)
🔴 next(4)
Nhìn qua, nó cũng không khác các Observables & Subject. Và nó tuân theo đặc tính của Behavior Subject, sẽ luôn nhận được giá trị mới nhất khi có 1 Subscriber mới đăng ký tới.
Terminate
Tương tự như Publish Relays
, khi subscribe gọi .dispose()
thì cũng sẽ thì sẽ không nhận được các giá trị mà subject phát tiếp. Bạn không thể kết thúc Relay được, vì chúng không hề phát đi error hay completed. Việc phát đi error & completed thì đều bị trình biên dịch ngăn cản.
Value
Một điều đặc biệt của Behavior Relay là bạn có thể lấy được giá trị hiện tại được lưu trữ trong Relay. Cách lấy như sau:
print("Current value: \(behaviorRelay.value)")
Output:
Current value: 4
.value
chính là đặc tính mà để Behavior Relay
thay thế Variable
Tham khảo: https://fxstudio.dev/rxswift-relays/