ReactiveX의 Observable 페이지를 정리해보았다!
이미 한국어 페이지를 지원한다는 것이 놀라웠다.
대단한 사람들
ReactiveX는 Observable Streams을 사용하는 비동기 프로그래밍(Asynchronous Programming)을 위한 API다.
Observable & Observer
Observer 패턴, Iterator 패턴, Functional Programming의 개념이 포함되어 있다.
이번 포스트에서 알아야하는 개념들이 있다.
Observer(관찰자): Subscriber(구독자)라고도 한다. Observable을 Subscribe(구독)한다.
Observable: Observer가 Subscribe하는 대상으로, 하나 또는 연속된 Item/Event을 Emit(배출/방출)한다.
Observer와 Observable을 잘 구분해야한다.
즉, Observer는 Observable을 Subscribe하고 있다가, Item/Event Object가 Emit되었을 때, 해당 Object를 받아서 데이터를 처리한다.
프로세스가 Block 될 필요 없이 각각의 Observer가 Observable을 관찰하고 있기 때문에 Concurrency가 증가한다.
Observable의 데이터 Stream을 아래처럼 그림으로 표현한 것을 Marble Diagrams이라고 한다.
Marble Diagrams에 대한 공식문서 설명
Event
Observable은 기본적으로 3개의 이벤트를 Emit한다.
onNext: 새로운 항목을 Emit(배출)한다. Emissions이라고 부른다. 이 이벤트는 0번 이상 호출되는 이벤트이다.
onError: 에러발생 시 전달한다.
onCompleted: 정상 종료 시 전달한다.
onError
, onCompleted
은 Notifications이라고 부르며, 반드시 둘 중 하나를 마지막 이벤트로 전달한다.
또한 Observer는 동시에 두 개 이상의 이벤트를 동시에 처리하지 않는다.
Observable은 Observer가 하나의 이벤트를 처리한 후에 이어지는 이벤트를 전달한다.
Disposables
Observable
이 onError
또는 onCompleted
이벤트를 전달하고 종료되면, 자원을 종료해야한다.
var disposeBag = DisposeBag()
Observable.from([1,2,3])
.subscribe {
print($0)
}
.disposed(by: disposeBag)
이렇게 해두면 disposeBag
이 해제될 때, Observable
도 함께 해제된다.
DisposeBag()
대신 dispose()
메소드를 사용하는 경우도 있지만, 공식적으로 DisposeBag()
의 사용을 권장하고 있다.
Operators
대부분의 Operators
들은 Observable
상에서 동작하고 Observable
을 리턴한다.
따라서 Operators Chain이 가능하다.
필요에 따라 여러가지 Operators
를 연속적으로 호출할 수 있으며, 호출한 순서대로 동작한다는 점을 기억해야한다.
호출 순서에 따른 차이 예시
let intArray = [0,1,2,4,5,5,6]
var disposeBag = DisposeBag()
Observable.from(intArray)
.take(3) // 처음 3개만 배출한다. -> [0,1,2]
.filter {
$0.isMultiple(of: 2) // 짝수만 방출한다. [0,2]
}
.subscribe {
print($0)
}
.disposed(by: disposeBag)
// Output
next(0)
next(2)
completed
=======================
Observable.from(intArray)
.filter {
$0.isMultiple(of: 2) // 짝수만 방출한다. -> [0,2,4,6]
}
.take(3) // 처음 3개만 방출한다. -> [0,2,4]
.subscribe {
print($0)
}
.disposed(by: disposeBag)
// Output
next(0)
next(2)
next(4)
completed
'iOS > RxSwift' 카테고리의 다른 글
[RxSwift] Relay (0) | 2022.09.17 |
---|---|
[RxSwift] Subject - AsyncSubject (0) | 2022.09.17 |
[RxSwift] Subject - ReplaySubject (0) | 2022.09.16 |
[RxSwift] Subject - BehaviorSubject (0) | 2022.09.15 |
[RxSwift] Subject - PublishSubject (0) | 2022.09.14 |