모든
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
가 시퀀스를 관찰하는 작업을 어디서 할지 정할 수 있다.