기본 개념
Observable : Swift 에서 제공하는 Sequence 와 동일한 개념이다.
Sequence : 개개의 요소들을 하나씩 순회할 수 있는 타입(e.g. 배열)
RxSwift 를 이해하기 위해 반드시 알아야 할 구성요소
① Observable : Sequence
② Operator : Observable 의 이벤트를 입력 받아 결과로 출력해내는 연산자
③ Scheduler : 직접적으로 생성하거나 커스텀할 일은 거의 없다. Rx 의 DispatchQueue
Observable 이란?
Observable<T>
Observable class 는 Rx 코드의 기반이 된다.
T 타입의 데이터 SnapShot 을 '전달' 할 수 있는 일련의 이벤트를 비동기적으로 생성하는 기능 → 다른 class 에서 만든 값을 시간에 따라 읽을 수 있다.
하나 이상의 observers 가 실시간으로 어떤 이벤트에 반응하게 되며, 관찰한 이벤트를 통해 App UI 를 업데이트 및 처리/활용하게 한다.
Observable 의 역할
Observable 은 크게 세 가지 형태의 이벤트를 방출한다.
enum Event<Element> {
case next(Element) // next element of a sequence
case error(Swift.Error) // sequence failed with error
case completed // sequence terminated successfully
}
① next : 다음 데이터를 전달하는 이벤트로, T 에 해당하는 Element 를 전달한다
② error : Observable 이 error 을 발생시켜 추가적으로 이벤트를 발생시키지 않겠다는 의미
③ completed : 성공적으로 일련의 이벤트를 종료시키는 이벤트
Observable → 말 그대로 "관찰 가능한" 이라는 뜻이다. Observer → "관찰자" 를 의미한다.
관찰 가능(Observable)한 Sequence 가 내보내는 세 가지 유형의 이벤트를 Observer 가 바라보는 방식으로 코드가 진행된다.
하단은 Observable 을 활용하여 이벤트를 발생하는 예시이다.
시간에 걸쳐서 발생하는 비동기 이벤트가 있다고 가정하자. 상단의 그림은 하나씩 이벤트를 방출하는 Sequence 를 나타낸 것이다.
<Int> Element 를 next 이벤트를 통해 하나씩 방출하는 Observable 이 있는데, 방출하였을 때 Observer 가 관찰을 해서 수신을 한다.
즉, Observable 과 Observer 만 있을 뿐, 어떤 delegate 프로토콜을 사용하거나, 어떤 class 간의 통신을 위해 closure 를 삽입할 필요가 없다.
어느 곳에서든 Observable 을 선언했고, 이 Observable 을 수신할 수 있는 Observer 가 있다면 문제 없이 방출되는 이벤트를 수신할 수 있다.
Finite Observable
자연적으로 혹은 강제적으로 종료가 되어야만 하는 파일 다운로드 활동에 대한 예시이다.
ios App 에서 인터넷 통신을 통해 파일을 다운로드하는 코드라 가정해보자.
파일 데이터를 받다가, 네트워크 연결이 끊어진다면 첫번째 그림처럼 일시정지 될 것이고, 성공적으로 파일 데이터를 다운로드한다면 두번째 그림처럼 완료 후 종료될 수 있다.
이를 RxSwift 코드로 표현한다면 다음과 같다.
Network.download(file: "https://www...")
.subscribe(onNext: {
// 임시 파일에 데이터 추가
},
onError: { error in
// 사용자에게 에러 표현
},
onCompleted: {
// 다운로드된 파일 사용
})
Network.download(file: "https://www...") 이 네트워크로 들어오는 데이터를 방출하는 Observable 데이터 인스턴스를 생각해보자. 사실상 Network.download 의 타입은 Observable <> 타입이다
이후 subscribe 메서드를 통해 수신(구독)을 하게 되면, 관찰자(observer)가 이 observable 을 통해 발생하는 onNext 라는 이벤트를 통해 데이터를 하나씩 받게 된다. onError 가 발생했을 때와 onCompleted 되었을 때의 Action 또한 정의할 수 있다.
Infinite Observable
단순하게 무한한 Sequence 가 있을 수 있다. 보통 UI 이벤트는 무한하게 관찰 가능한 Sequence 이다.
e.g. 기기의 가로, 세로 모드에 따라 반응해야하는 코드
UIDevice.rx.orientation
.subscribe(onNext: { current in
switch current {
case .landscape:
// 가로모드 배치
case .portrait:
// 세로모드 배치 }
})
이러한 Sequence 는 사실상 무한하기 때문에 항상 최초값을 가지고 있어야 하며, 사용자가 절대 디바이스를 회전하지 않는다고 해서 이벤트가 종료되었다고 보기 어렵다. 단지 이벤트가 발생한 적이 없을 뿐..
해당 Observable 에서는 절대 발생하지 않을 일인 onError, onCompleted 는 생략할 수 있다.
Operator
UIDevice.rx.orientation
.filter { value in
return value != .landscape }
.map { _ in
return "세로로만 볼거예요!"
}
.subscribe(onNext: { string in
showAlert(text: string)
})
' iOS > RxSwift' 카테고리의 다른 글
RxSwift - Subject (0) | 2022.11.01 |
---|---|
RxSwift - Traits (Single, Maybe, Completable) (0) | 2022.10.31 |
RxSwift - Observable 과 dispose / disposeBag (0) | 2022.10.24 |
RxSwift - Observable 과 subscribe (0) | 2022.10.24 |
RxSwift - Observable 생성 시 사용하는 연산자 정리 (0) | 2022.10.24 |