teunteun2
[RxSwift] Observable & Observer & Dispose를 이해해보자 본문
순서
- RxSwift ? RxCocoa?
- Observable & Observer & Subscribe
- Observable
- Dispose
1. RxCocoa는 뭘까 ?
~ Cocoa Touch Framework에 Rx를 합친 RxSwift 기반의 라이브러리 ~
RxSwift와 가장 큰 차이점은
RxSwift는 기본적인 데이터 비동기 처리가 가능하다면
RxCocoa는 tableView.rx / button.rx / pickerView.rx 와 같이
각 UI요소의 기능 (ex. tap, selected item 처리 등) 의
비동기 처리를 돕는다는 것 !
1-1. RxSwift & RxCocoa & 그 외
RxSwift와 RxCocoa 외에도 테이블뷰와 컬렉션뷰
datasource delegate 기능을
좀 더 편리하게 쓸 수 있는 RxDataSources,
서버통신 시 많이 쓰이는 alamofire에
Rx를 합친 RxAlamofire 등의 Rx 기반 라이브러리가 몇개 더 있다.
https://github.com/RxSwiftCommunity
2. RxSwift의 Observable & Observer 그리고 Subscribe 이해
Observable
비동기 처리가 필요한 요소(데이터 , 이벤트)를
‘관찰 가능한 상태’로 표현한 것이라고 생각합시다. 쉽게 ?
Observer
Observable를 Subscribe 한 것을 Observer 라 합니다.
그래서 옵저버를 구독자라고 표현하기도 해요.
Observer는 이벤트가 emit 되면 관찰 중이기 때문에 바로 알 수 있겠죠 ?
Subscribe
Observable와 Observer를 연결시켜주는 메서드
이 메서드는 Subscribe 뿐만 아니라 bind, drive 등의
다른 종류의 메서드가 더 있어요.
<코드 예시>
let observable = Observable.just([ "영화", "드라마", "애니메이션" ]}
let observer = Observer.subscribe({ event in
print(event)
})
// event를 출력해보면
/*
next(1)
next(2)
next(3)
next(4)
next(5)
completed
*/
- 정리 -
뷰를 짜다보면 특정 이벤트에 따라 데이터가 변경되거나 ,
뷰 또는 로직 자체가 변경되기도 합니다.
여기서 말하는 이벤트!
이 이벤트를 방출(emit)하는 Observable이 있고,
이 이벤트를 캐치해서 처리하는 Observer가 있는 것이죠
서로를 연결해주기 위해 Observer가 Observable를 subscribe 하며 ,
Observer & Observable 두 역할을 모두 할 수 있는 Subject가 있습니다.
2. Observable
2-1. Observable 생성 Operator
Observable.create 메서드보다
좀 더 간편하게 Observable를 생성하기 위한 오퍼레이터들입니다.
Just
하나의 값만 방출하는 Operator
Of
2개 이상의 값을 방출하는 Operator
From
배열의 각 요소를 방출할 때 쓰이는 Operator , 배열 각 요소를 Observable로 방출합니다.
CombindLatest
2개 이상의 항목을 연산하거나 결합하여 Observable로 방출합니다.
let itemsA = [1.1, 2.2, 3.3, 4.4, 5.5]
let itemsB = [6.6, 7.7, 8.8, 9.9]
// ------ just
Observable.just(itemsA)
.subscribe { value in
print(value)
}
.disposed(by: disposeBag)
// next([1.1, 2.2, 3.3, 4.4, 5.5])
// completed
// ------ of
Observable.of(itemsA, itemsB)
.subscribe { value in
print(value)
}
.disposed(by: disposeBag)
// next([1.1, 2.2, 3.3, 4.4, 5.5])
// next([6.6, 7.7, 8.8, 9.9])
// completed
// ------ from
Observable.from(itemsB)
.subscribe { value in
print(value)
}
.disposed(by: disposeBag)
// next(6.6)
// next(7.7)
// next(8.8)
// next(9.9)
// completed
2.2 Observable LifeCycle
- create 오퍼레이터를 통해 Observable를 생성
- subscribe를 통해 Observable를 실행시킨다 (옵저버와 연결)
- next를 통해 이벤트를 방출
- 이 과정에서 오류가 발생하면, error를 알리고, 모든 이벤트가 정상적으로 emit되었다면 completed 를 알린다
- deinit 되는 시점 - 즉, sequence가 종료되는 시점에 dispose 된다
- error , completed를 전달받으면 sequence가 종료되며, 종류 후엔 이벤트가 발생하지 않는다. 즉 Observable 재사용 불가 !
3. Dispose
public protocol Disposable {
func dispose()
}
- Disposable은 구독중인 stream을 원하는 시기에 처리할 수 있도록 돕습니다.
Observable의 next 이벤트가 error, completed 상태로 넘어가면
disposed로 넘어가 Sequence가 종료되는데요,
여기서 만약 next 이벤트가 무한히 방출될 수 있는 상황에선 ?
disposed 될 일이 없겠죠 ?
클래스의 메모리가 해제되는 시점에 Disposed 되지만,
RootViewController일 경우 메모리에서 클래스가 해제되지 않아요.
=> 이럴 경우 직접 관리를 해주기 위해
dispose 메서드를 호출해서 정리해줄 수 있어요.
이런식으로요
let Observable1 = 어쩌구 저쩌구 선언
Observable1.dispose()
근데 만약 여러 Observable을 구독한다면?
모든 Observable 마다 dispose()를 호출해주는 것은 비효율적일거에요.
이 과정을 한 번에 처리해주기 위해
존재하는 것이 바로 DisposeBag() 입니다.
let disposeBag = DisposeBag()
self.disposeBag = DisposeBag()
// disposeBag 인스턴스를 초기화 해주기만 하면 한 번에 정리 가능 !
→ 다음시간 까지 정리할 것
- Observable vs Subject vs Relay
- Subject 종류와 특징
- Subscribe 외의 구독 메서드 종류와 특징