+1

Bài 7. RxSwift – Relays

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/


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.