[RxSwift] - Basic(Observable, Dispose, Subscribe)

sun02·2022년 2월 3일
0

RxSwift

목록 보기
1/12

Observable이란?

'Every Observable sequence is just a sequence.'

모든 observable sequence는 단지 일련의 순서들일 뿐입니다.
observable은 그 혼자서는 아무런 기능을 할 수 없고,
우리는 Observable이라는 객체를 통해 단지 이벤트의 흐름을 표현합니다.

Observable

1. Observable 표현

Observable<Type>

Observable을 정의할 때는 다음과 같이 표현합니다.
만약 Type에 Int가 들어간다면,
Int를 방출하는 이벤트의 흐름을 가진 Observable이라는 의미입니다.

2. Observer

일련의 이벤트들의 흐름인 Observable에서
Observable은 이 이벤트들에 실시간으로 반응하는
하나 이상의 observer를 가집니다.

3. Event

Observable은 세 가지 유형의 이벤트를 방출(emit)합니다.


enum Event<Element> {
    case next(Element)
    case error(Swift.Error)
    case completed
}
    

1) Next

: 다음 순서의 이벤트를 전달합니다.

Observable은 next이벤트를 계속해서 방출(emit)할 수 있습니다.

2) Completed

: 성공적으로 이벤트를 종료합니다.

Observable은 Completed 이벤트를 방출(emit)하여 완전 종료됩니다.

3) Error

: 추가적인 이벤트 생성 없이 종료합니다.

Observable은 Error 이벤트를 방출(emit)하여 완전 종료됩니다.

4. Dispose

sequence가 Error나 Completed 이벤트를 방출한다면,
sequence의 element를 다루는 모든 내부 소스들이 해제됩니다.

그러나 만약 sequence element의 생성을 취소하고 소스를 즉시 해제하고 싶다면 반환(return)받은 구독(subscription)에서 dispose를 호출합니다.

만약 sequence가 유한한 시간 내에 종료된다면, dispose를 하지 않아도 소스 누수가 없습니다. 그러나 이 소스는 element 생성을 마치거나 error를 반환(return)하여 sequence가 종료될 때까지 사용됩니다.

만약 sequence가 유한한 시간 내에 종료되지 않는다면, dispose가 수동으로 호출되거나 disposebag이 자동으로 호출되거나, takeUntil같은 연산자를 사용하는 등 다른 방식이 호출되지 않는 한 소스는 영구적으로 할당됩니다.

disposeBag과 takeUntil 연산자를 사용하는 것이 소스를 정리하는 강력한 방법입니다. 또한, sequence가 시간 내에 종료 되더라도 이들을 사용하는 것이 좋습니다.

1) DisposeBag

disposeBag은 ARC와 같은 행동을 Rx에 반환합니다.

ARC란? -> Automatic Reference Counting
: Swift가 자동으로 참조 횟수를 관리하여 더이상 사용하지 않는 인스턴스를 알아서 메모리에서 해지함

disposeBag이 할당 해지되면, 자동으로 disposeBag에 추가된 각각의 disposable을 dispose합니다.

disposeBag은 dispose메서드를 가지고 있지 않기 때문에,
의도적으로 dispose를 호출할 수는 없습니다.
새로운 disposeBag을 생성한다면 disposeBag이 바로 비워집니다.

self.disposeBag = DisposeBag()
  • 이렇게 하면, 오래된 reference들이 지워지고, resource들이 disposal(처리,비워짐)됩니다.

만약 명시적인 dispose가 여전히 필요하다면 CompositeDisposable을 사용할 수 있습니다.
이 메서드는 추가된 disposable을 즉시 폐기합니다.

2) take until

takeUntil 연산자를 사용하여 dealloc에서 구독을 자동으로 폐기할 수 있습니다.

sequence
    .take(until: self.rx.deallocated)
    .subscribe {
        print($0)
    }

5. Subscribe

When an observable is created, it doesn't perform any work simply because it has been created.

Observable이 생성되었을 때, 단순히 생성되었다는 것만으로 Observable이 어떠한 작업을 수행하지는 않습니다.

Observable이 여러 방법으로 element를 생성하긴 하지만
Observable을 반환하는 메서드만 호출한다면, sequence생성이 수행되지 않습니다.

Subscribe 메서드가 호출될 때 sequence 생성이 시작됩니다.

class Observable<Element> {
    func subscribe(_ observer: Observer<Element>) -> Disposable
}

출처 - RxSwift Github

0개의 댓글