모든
Observable인스턴스는Sequence이다
Observable<T>
enum Event<Element> {
case next(Element) // next element of a sequence
case error(Swift.Error) // sequence failed with error
case completed // sequence terminated successfully
}

위와 같이 이벤트가 발생한 순서를 비동기적으로 Observer들에게 방출한다.
이 때, Observe를 무한히 하는지에 따라
finite Observable 과
infinite Observable로 나뉜다.

기본적으로 UI에 관한 Observable은 infinite인 경우가 많다.
// Finite Observable
Network.download(file: "https://www...")
.subscribe(onNext: { data in
//임시 파일에 데이터 추가
},
onError: { error in
//사용자에게 에러 표현
},
onCompleted: { //다운로드 된 파일 사용
})
/// Infinite Observable
UIDevice.rx.orientation
.subscribe(onNext: { current in
switch current {
case .landscape:
// 가로모드 배치
case .portrait:
// 세로모드 배치
}
})
RxSwift에는 쉽게 Observable을 생성하고 변형하고 합치는 등 다양하게 연산을 할 수 있도록 도와주는 Operator 라는 것이 존재한다.
// 아래 코드에서는 방출하는 결과를 변형하거나(map), 필터링하는(filter)
// Operator를 확인할 수 있다.
UIDevice.rx.orientation
.filter { value in
return value != .landscape
}
.map { _ in
return "세로로만 볼거예요!"
}
.subscribe(onNext: { string in
showAlert(text: string)
})
스케쥴러는 작업을 어디서 수행할지에 관한 작업을 추상화한다. Main thread 에서 수행할지, background 에서 수행할지 등을 정할 수 있게 해준다. Rx를 사용하지 않아도 iOS 앱을 만들 때 기존 GCD로 작업을 어디에서 수행할지 정할 수 있다.
DispatchQueue의 main은 작업을 Main thread에서 수행하는 것을 의미했고, global은 백그라운드에서 수행하는 것을 의미했다. Dispatch queue뿐만 아니라 작업들을 수행하는 데에는 current thread, operation queues, new threads, thread pools, run loops 등이 사용된다.
RxSwift에서는 스케줄러를 통해 Observable을 생성하는 작업을 어디서 할지, 그리고 Observer가 시퀀스를 관찰하는 작업을 어디서 할지 정할 수 있다.
