RxSwift를 21일간 공부하는 루틴
"Rx를 기깔나게 쓰는 신입개발자 도전" 시작 🚀
observable이 전달하는 이벤트는 onNext, onCompleted, onError 가 있다.
"🏋🏻♀️"를 방출하는 Observable을 생성하고 구독하는 코드를 예로 들어보겠다.
이때 전달되는 이벤트에 따라 각각 print문을 찍게끔 하였다.
// 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 호출을 권장하는 편이다.
만약 구독자가 너무 많은데 그 많은 구독자가 다 dispose를 실행하면, 관리하기 효율적이지 않을 것이다.
그래서 DisposeBag
을 활용해 관리를 효율적으로 할 수 있다.
DisposeBag에 대한 정리이다.
이해한 내용으로는, DisposeBag은 disposables를 갖고 이 disposables가 disposeBag이 할당해제하려할때마다 dispose를 호출하는 방식이다.
let disposeBag = DisposeBag()
이렇게 우선 생성을 해준다음, .disposed(by: disposeBag)
이렇게 담아주면 된다.
다음번에 subject에 대해 정리해보도록 하겠다.
으쌰으쌰 🏋🏻♀️ 귀엽네요 ㅋㅋㅋㅋ
딴딴클럽 끝까지 화이팅입니다!
Rx를 쓰면 확실히 좋겠구나! 라고 느껴지시는 부분이 있으셨나요?!
아직 없으시면 다음에 한번 적어봐주시면 꼭 읽어보겠습니다 :)