[RxSwift] Observables

Martin Kim·2022년 4월 23일
0

RxSwift

목록 보기
1/8

Observable

  • Observable은 Rx의 심장
  • Rx에서는 Stream이라는 표현 대신 Sequence라는 표현을 사용
  • Observable은 Sequence이다.
  • Observable은 일정 기간동안 이벤트를 생성하며, 이를 방출(emit)이라고 한다.
  • 이벤트는 숫자 또는 사용자 정의 유형의 인스턴스와 같은 값을 포함하거나 탭과 같은 인식된 제스처를 포함할 수 있습니다.
  • Observable이 종료될 때에는 completed 이벤트가 발생
  • Observable이 아직 종료되지 않았지만, 어떤 오류로 인해 중단될 경우 error 이벤트가 발생
  • completed, error 이벤트 발생 후에는 모두 어떠한 이벤트도 발생하지 않고 Observable이 중단된다.
/// Represents a sequence event.
///
/// Sequence grammar:
/// **next\* (error | completed)**
public enum Event<Element> {
    /// Next element is produced.
    case next(Element)
    /// Sequence terminated with an error.
    case error(Swift.Error)
    /// Sequence completed successfully.
    case completed
}

Observable 시퀀스 생성 메서드 정리

  • Observable.just

    • just 메서드는 단일 요소만 포함하는 Observable 시퀀스를 생성하기 때문에 이런 이름이 붙여졌다. Observable의 정적 메서드이다. 그러나 Rx에서는 메소드를 "연산자"라고 한다.
  • Observable.of

    • of 연산자에는 가변 매개변수가 있고, 이를 바탕으로 제네릭 타입을 추정한다.
    • 여러 개의 인자를 넣어 Observable을 생성할 수 있다.
  • Observable.from

    • 배열을 인자로 받아 각 배열 요소를 방출하는 Observable 시퀀스를 생성한다.
  • Observable.empty

    • 아무런 next이벤트도 방출하지 않고, 바로 completed이벤트를 방출하는 Observable 시퀀스를 생성한다.
  • Observable.never

    • 아무것도 방출하지 않고, 절대 종료되지 않는 Observable 시퀀스를 생성한다.
  • Observable.range

    • 범위를 지정해서 값을 방출하는 Observable 시퀀스를 생성한다.
  • Observable.create

    • observer들에게 내보낼 이벤트를 지정하여 Observable 시퀀스를 생성한다.
    • subscribe 라는 단일 매개변수를 사용하며, observer에게 방출할 이벤트를 직접 지정한다.
    • subscribe 매개변수는 이스케이프 클로저로, (AnyObserver) → Disposable 타입이다.
    • 마지막에 Disposables.create() 로 Disposable을 생성하여 리턴한다.
  • Observable.deffered

    • subscriber가 지정되는 것을 기다리는 Observable을 생성하는 대신, 각 subscribers들에게 새로운 Observable 시퀀스를 제공하는 Observable 팩토리를 만든다.

      let disposeBag = DisposeBag()
      // 1
        var flip = false
        // 2
        let factory: Observable<Int> = Observable.deferred {
          // 3
          flip.toggle()
      // 4
          if flip {
            return Observable.of(1, 2, 3)
      } else {
            return Observable.of(4, 5, 6)
          }
      }
    • 외부적으로는 Observable 팩토리와 일반적인 Observable 시퀀스를 구별할 수 없다. 똑같이 subscribe 메서드를 통해 구독하면 된다.

Subscribing

  • RxSwift의 Observable을 Subscribing, 즉 구독하는 것은 NotificationCenter의 알림을 수신하는 것과 비슷하다. addObserver() 메서드 대신 subscribing()을 사용하는 것이다. 일반적으로 .default 싱글턴 객체만 사용하는 것과는 달리, Rx에서의 각각의 Observable은 다르다.
  • 기억해야 할 것은, observable은 단지 시퀀스의 정의일 뿐이며, subscribing이 Swift Standard Library Iterator의 next() 메서드를 호출하는 역할과 같다.
  • next, error, completed 이벤트에 대한 각각의 핸들러를 지정할 수 있다.
  • Event에는 element 속성이 있다. next 이벤트에만 있으며, 옵셔널로 감싸져 있다.
  • 다음과 같은 형식으로 각 이벤트에 대한 element를 바로 액세스 할 수도 있다.
    observable.subscribe(onNext: { element in
      print(element)
    })

Disposing & Terminating

  • Observable은 Subscribing이 설정될때 까지 아무런 동작도 하지 않는다는 것에 유의하자

  • Subscribing은 Observable을 트리거 하는 동작이다.

  • 하지만 subscribing을 취소하여 수동으로 Observable을 종료시킬수도 있다.

  • 명시적으로 subscribing을 취소하려면, dispose()를 호출한다.

  • 각 subscribing을 개별적으로 관리하여 취소하는 것은 너무 귀찮으므로 RxSwift에는 DisposeBag이라는 타입이 있다. 이것은 일반적으로 각 Disposable 에서 disposed(by:) 메서드를 사용하여, 담길 DisposeBag을 지정하고, 해당 DisposeBag이 메모리에서 할당 해제 될 때, 담겼던 Observable 시퀀스들을 한꺼번에 할당 해제 시킨다.

  • 일반적으로 다음의 단계가 자주 쓰인다.

    1. DisposeBag을 생성한다.
    2. Observable을 생성한다.
    3. subscribing으로 Observable을 구독한다.
    4. subscribing에서 반환된 Disposable을 DisposeBag에 추가한다.

왜 이런 동작을 해줘야 할까?

  • disposeBag에 구독을 추가하는 것을 잊거나
  • 구독이 끝났을 때 수동으로 dispose를 호출하거나
  • 다른 방식으로 관찰 가능 항목이 어느 시점에서 종료되도록 하면 메모리 누수가 발생할 수 있기 때문이다.

Traits

  • traits는 일반적인 Observable보다 좁은 행동 집합을 가진 Observable이다.
  • 대신 traits를 사용할 수 있는 곳이면 어디든 Observable을 사용할 수 있다.
  • 사용의 목적은 코드를 읽는 사람이나, API 호출 부분에서 그 의도를 명확히 밝히기 위해서이다.
  • 코드를 직관적으로 만드는데 도움이 된다.
  • 3가지 종류가 있다. Single, Maybe, Completable

Single

  • success(value) 또는 error(error) 이벤트를 방출한다.
  • success는 next와 completed 이벤트의 조합이라고 생각하면 된다.
  • 네트워크 API 호출이나 데이터 로드 시 성공 또는 실패를 나타내고 싶을 때 유용하게 사용할 수 있다.

Completable

  • completed 또는 error(error) 이벤트 만을 내보낸다.
  • 어떤 값도 방출하지 않는다.
  • 파일 쓰기와 같은 작업이 완료되었는지, 혹은 실패되었는지에만 관심이 있는 경우에 사용할 수 있다.

Maybe

  • Single과 Completable의 합성
  • success(value), completed, error(error)를 방출할 수 있다.
  • 기본적으로 성공혹은 실패할 수 있는 경우의 작업을 구현하고 만약 성공할 경우 값을 반환해야 하는 경우에 적용할 수 있다.

출처: Raywenderlich RxSwift. Reactive Programming with Swift 도서

profile
학생입니다

0개의 댓글