iOS 응용 (swift)
[iOS - swift] RxSwift의 Observable, Single, Completable 구분하여 사용하기
jake-kim
2023. 2. 6. 22:39
Single, Completable 차이
- Single과 Completable 차이
- Single은 onSuccess, onError 두 가지만 존재하고, success에서 값을 같이 방출
- Completable은 onCompletable, onError 두 가지만 존재하고, 따로 값을 방출 x
- 값을 단순히 가져오거나 특정 일을 한 후 반환값이 필요 없는 경우, Single<Void> 대신에 Completable을 사용할 것
import UIKit
import RxSwift
class ViewController: UIViewController {
let observable = Observable<Int>.create { observer in
observer.onNext(10)
print("finish")
return Disposables.create()
}
let single = Single<Int>.create { observer in
observer(.success(1)) // 또는 observer(.error())
return Disposables.create()
}
let completable = Completable.create { observer in
observer(.completed) // 또는 observer(.error())
return Disposables.create()
}
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
single
.debug("debug1>")
.subscribe()
.disposed(by: disposeBag)
// subscribed > next(1) > completed > isDisposed
completable
.debug("debug2>")
.subscribe()
.disposed(by: disposeBag)
// subscribed > completed > isDisposed
}
}
Observable과 Single, Completable 차이
- Single과 Completable은 한 번 subscribe하고 이벤트가 방출되면 바로 dispose되어 1회성으로 사용할 때 사용
- 주로 API 통신 할 때 Single과 Completable 활용
- Observable은 한 번 subscribe하면 이벤트가 방출되더라도 dispose되지 않고 스트림을 계속 subscirbe하고 있는 상태
ex) observable을 subscribe할 때 next이벤트가 발생해도 dispose 되지 않음
private func getSomeObservable() -> Observable<Int> {
.create { observer in
observer.onNext(1)
return Disposables.create()
}
}
getSomeObservable()
.debug("debug0>")
.subscribe()
.disposed(by: disposeBag)
// subscribed > next(1)
정리
- 계속 observe하여 이벤트가 발생할 때마다 특정 작업을 처리해야하는 경우? (상태 바인딩 후 UI 변경하는 경우)
- Observable사용
- 필요할때마다 호출하여 특정 작업을 하고싶은 경우? (API 통신, 등등)
- Single이나 Completable 사용
- Single과 Completable
- 반환값이 필요 없는 경우(사용자 정보 업데이트 API 호출 등) - Completable
- 반환값이 필요한 경우(사용자 정보 얻어오기 API 호출 등) - Single
* 전체 코드: https://github.com/JK0369/ExSingle