관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] RxSwift의 Observable, Single, Completable 구분하여 사용하기 본문

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

Comments