카테고리 없음

RxSwift) subscribe, bind, drive

나태한개발 2024. 10. 17. 04:11

subscribe

subscribe는 가장 기본적인 옵저버블 구독 방법이다. 옵저버블에서 발생하는 세 가지 이벤트, 즉 Next, Error, Completed에 반응할 수 있다.

observable.subscribe(
    onNext: { value in
        print("Next:", value)
    },
    onError: { error in
        print("Error:", error)
    },
    onCompleted: {
        print("Completed")
    }
).disposed(by: disposeBag)

 

  • 에러 처리 가능: onError를 통해 에러 이벤트를 처리할 수 있다.
  • 스레드 관리: 백그라운드 스레드에서도 동작 가능하며, 네트워크 요청이나 파일 I/O 등 비동기 작업 처리에 적합하다.
  • 멀티 캐스팅 없음: 여러 구독자가 있을 경우 각 구독자에게 독립적인 스트림을 제공한다.
  • 네트워크 요청, 파일 I/O 등 비 UI 작업에서 에러 처리 및 백그라운드 작업을 다룰 때 subscribe를 사용하는 것이 좋다.

bind

bind는 주로 UI 업데이트를 위해 사용된다. 특히 옵저버블을 UI 요소에 바인딩할 때 많이 사용된다. bind는 UI 작업을 간단하게 해주지만 몇 가지 중요한 차이점이 있다.

observable.bind(to: label.rx.text)
    .disposed(by: disposeBag)

 

 

  • 에러 무시: bind는 Error 이벤트를 자동으로 무시하고 처리하지 않는다.
  • 메인 스레드에서 실행: 항상 메인 스레드에서 실행되며, UI 업데이트에 안전하다.
  • 멀티 캐스팅 없음: 각 구독자에게 별도로 이벤트가 전달된다.
  • UI 요소와 값을 간단하게 바인딩할 때, 그리고 에러 처리가 필요 없을 때 사용한다. 예를 들어, UILabel, UIButton, UITextField와 같은 UI 요소에 데이터를 바인딩할 때 유용하다.

drive

drive는 UI 업데이트를 위해 만들어진 특수한 옵저버블 타입인 Driver와 함께 사용된다. bind와 비슷하지만 더 안전하고, 상태를 여러 구독자 간에 공유할 수 있다는 큰 차이가 있다.

driver.drive(label.rx.text)
    .disposed(by: disposeBag)

 

 

  • 에러 이벤트 없음: Driver는 에러가 발생하지 않는다. 따라서 drive에서는 에러를 처리할 필요가 없다.
  • 메인 스레드에서 실행: Driver는 항상 메인 스레드에서 동작하므로 UI 작업에 매우 적합하다.
  • 멀티 캐스팅 지원: Driver는 상태를 공유한다. 여러 구독자가 동일한 데이터를 사용할 때 매우 유용하다.
  • 핫 옵저버블: Driver는 구독자가 없어도 데이터를 유지하며, 데이터를 새롭게 발행하지 않고 공유한다.
  • 상태를 여러 구독자와 공유하고 안전하게 UI 업데이트를 해야 할 때, 특히 에러 없이 데이터를 처리하고 싶을 때 drive를 사용하면 좋다.

Driver

Driver는 RxCocoa에서 제공하는 특수한 옵저버블 타입으로, 주로 UI와 관련된 작업에서 사용된다. Driver는 일반적인 옵저버블보다 더 안전하게 UI 바인딩을 할 수 있도록 설계되었다. 특히, UI 업데이트 작업에서 자주 발생할 수 있는 스레드 문제나 에러를 방지하고 싶을 때 유용하다.

let driver = someObservable
    .asDriver(onErrorJustReturn: "Error")
    
driver
    .drive(label.rx.text)
    .disposed(by: disposeBag)

 

  • 에러가 발생하지 않음: Driver는 에러가 발생하지 않는 옵저버블이다. 일반 옵저버블과 달리, Driver는 에러 이벤트를 방출하지 않으므로 에러 처리를 따로 할 필요가 없다.
  • 메인 스레드에서 실행: Driver는 항상 메인 스레드에서 동작한다. UI 작업은 반드시 메인 스레드에서 이루어져야 하기 때문에, 이 특성 덕분에 UI 업데이트에서 스레드 문제를 방지할 수 있다.
  • 상태를 공유 (멀티 캐스팅): Driver는 핫 옵저버블이다. 즉, 구독자가 없더라도 이벤트를 계속 방출하고, 여러 구독자가 있을 경우에도 동일한 데이터를 공유한다. 여러 UI 요소에서 같은 데이터를 사용할 때 유용하다.

※bind 에서 무시, drive에서 처리하지 않음※

 

  • bind: 에러가 발생할 수 있는 일반적인 옵저버블을 UI에 바인딩할 때, 그 옵저버블에서 에러가 발생해도 bind는 이를 따로 처리하지 않고 그냥 무시한다.
  • drive: Driver는 아예 에러가 발생하지 않도록 설계된 옵저버블 타입이다. 그래서 drive에서는 에러 자체가 발생하지 않기 때문에, 굳이 에러를 처리할 필요가 없고 에러를 다룰 수도 없다.