[RxSwift] 2. Disposables

miori·2022년 2월 8일
1

RxSwiftBasic

목록 보기
4/29

RxSwift를 21일간 공부하는 루틴
"Rx를 기깔나게 쓰는 신입개발자 도전" 시작 🚀


Disposables

observable이 전달하는 이벤트는 onNext, onCompleted, onError 가 있다.

"🏋🏻‍♀️"를 방출하는 Observable을 생성하고 구독하는 코드를 예로 들어보겠다.
이때 전달되는 이벤트에 따라 각각 print문을 찍게끔 하였다.

onDisposed

// Observable 생성과 구독
Observable<String>.create { observer in
    observer.onNext("🏋🏻‍♀️")
    //observer.onCompleted()
    observer.onError(Err.error)
    return Disposables.create()
}.subscribe(
    onNext: { print("Next",$0) },
    onError: { print("Error",$0) },
    onCompleted: { print("Completed") },
    onDisposed: { print("Disposed") }
).disposed(by: disposeBag)

/*
 output :
 (case onComplete)
 Next 🏋🏻‍♀️
 Completed
 Disposed
 (case onError)
 Next 🏋🏻‍♀️
 Error error
 Disposed
 */

전체 코드 링크는 깃허브에서 확인할수 있다.👩🏻‍💻 포스팅한 코드 이외에, Error Enum에 대한 정의나, disposeBag을 선언한 코드가 포함되어있다.

output을 보면 onDisposed에서 Disposed가 출력이 되었다.
처분하다라는 뜻을 가진 dispose로 부터 onDisposed이벤트는 무언가 처분이 되었을때 호출이 되는 이벤트임을 짐작할 수 있다.

onDisposed는 직감대로 Observable과 관련된 리소스가 모두 해제되었을 때 호출이 된다.

하지만, Observable이 방출하는 이벤트는 onNext, onCompleted, onError 3가지이다. 말인 즉슨, onCompleted나 onError 로 Observable이 종료 되었다면, 리소스가 자동으로 해제된다.

이부분에서 개인적으로 viewController의 life-cycle(생명주기)가 떠올랐다. viewController의 생명주기를 활용해, 특정 시점에서 함수를 override하여 원하는 작업을 추가할수 있다. 이와 마찬가지로 dispose 되었을때 해야하는 작업이 있다면, onDisposed이벤트를 활용하면 될것같다.

여기서 중요한점은, 물론 리소스가 자동으로 해제되지만, 메모리 누수문제가 발생할 수 도 있기 때문에, dispose 호출을 권장하는 편이다.

DisposeBag()

만약 구독자가 너무 많은데 그 많은 구독자가 다 dispose를 실행하면, 관리하기 효율적이지 않을 것이다.
그래서 DisposeBag을 활용해 관리를 효율적으로 할 수 있다.

disposebag-xcode

DisposeBag에 대한 정리이다.
이해한 내용으로는, DisposeBag은 disposables를 갖고 이 disposables가 disposeBag이 할당해제하려할때마다 dispose를 호출하는 방식이다.

DisposeBag 생성과 담기

let disposeBag = DisposeBag() 이렇게 우선 생성을 해준다음, .disposed(by: disposeBag) 이렇게 담아주면 된다.


다음번에 subject에 대해 정리해보도록 하겠다.

profile
iS를 공부하는 miori 입니다.

2개의 댓글

comment-user-thumbnail
2022년 2월 8일

으쌰으쌰 🏋🏻‍♀️ 귀엽네요 ㅋㅋㅋㅋ
딴딴클럽 끝까지 화이팅입니다!

Rx를 쓰면 확실히 좋겠구나! 라고 느껴지시는 부분이 있으셨나요?!
아직 없으시면 다음에 한번 적어봐주시면 꼭 읽어보겠습니다 :)

1개의 답글

관련 채용 정보