study record

[RxSwift] Observable이란? 본문

iOS/RxSwift

[RxSwift] Observable이란?

asong 2022. 8. 6. 23:19

Observable

여러 이벤트들을 방출(=”emit”)할 수 있는 대상

emit : 이벤트를 계속해서 비동기적으로 생성하는 기능

sequence란?

Observable = Observable sequence = sequence

Observable 이벤트들은 sequence라고 할 수 있다.

이벤트의 종류

next

  • 구성 요소를 계속해서 방출할 수 있는 기능 (= observable 구독자에게 데이터 전달)

completed

  • 성공적으로 next이벤트가 완료되었을 때 발생하며, 이벤트를 종료시킨다. (= observable 구독자에게 완료되었음을 알림)

error

  • 이벤트에 오류가 있음을 알고 중간에 스트림을 종료시킬 수 있는 기능 (observable 구독자에게 오류를 알린다.)

 

API.download(file: "<http://www>...")
  .subscribe(onNext: { data in
    ... append data to temporary file
  },
  onError: { error in
    ... display error to user
  },
  onCompleted: {
    ... use downloaded file
  })
  • error, complete가 발생한 상황에 모두 Dispose가 호출되고 스트림 종료된다.
  • onDisposed: 시컨스가 버려진 경우 호출된다.
  • Observable 타입들은 모두 Disposable 타입을 반환한다. 이 값을 이용해 스트림을 종료시키고 작업을 종료한다.
  • 구독자는 방출하는 이벤트를 전달받고 각 상황에 따라 액션을 취한다.

 

Subscribe

  • 이벤트에 대한 처리
  • 필요한 이벤트에 대해서만 골라서 처리할 수 있다.
  • 이벤트에 대한 처리를 클로저 내부에서 진행한다. 따라서 약한 참조를 꼭 해서 메모리 누수를 방지해야 한다. (클로저 내부에서 self를 참조하는 경우에만 해당)
  • .subscribe는 정수의 이벤트 객체를 파라미터로 하는 escaping 클로저 형식 메소드, 반환값은 Disposable이다.

 

dispose

  • subscribe를 취소하는 것
    • 구독을 취소하고 종료한다는 의미의 메서드
  • Observable의 이벤트가 dispose()에서 종료된다.
  • disposeBag : dispose에 대한 리턴 값을 담는 객체.
    • 각각의 구독에 대해 일일이 관리하는 것은 호율적이지 못하기 때문에 Disposable들을 모아놨다가 한 번에 처분하는 방식
  • 모든 순서에 대한 사용 완료 후에는 dispose를 호출하여야 정상적으로 구독 취소와 동시에 메모리가 해제된다.
example(of: "DisposeBag") {
    
    let disposeBag = DisposeBag()
    
    Observable.of("A", "B", "C")
        .subscribe{
            print($0)
        }
        .disposed(by: disposeBag) // subscribe로부터 방출된 리턴 값을 disposeBag에 추가
    
    print(disposeBag)
    // prints : RxSwift.DisposeBag
}

 

 

참고

'iOS > RxSwift' 카테고리의 다른 글

[RxSwift] Rx Operators (What i frequently used)  (0) 2022.09.04
[RxSwift] Scheduler란?  (0) 2022.08.07
Reactive Programming이란?  (0) 2022.07.17
[RxSwift] Driver란?  (0) 2022.03.29
[RxSwift] Subject와 Relay  (0) 2022.03.14