카테고리 없음
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에서는 에러 자체가 발생하지 않기 때문에, 굳이 에러를 처리할 필요가 없고 에러를 다룰 수도 없다.