-
RxSwift ObservableRxSwift 2021. 7. 14. 16:16
http://reactivex.io/documentation/ko/observable.html
- observable = observable sequence = sequence: 각각의 단어를 계속 보게 될 것인데 이는 곧 다 같은 말이다. (Everything is a sequence)
- 중요한 것은 이 모든 것들이 비동기적(asynchronous)이라는 것.
- Observable 들은 일정 기간 동안 계속해서 이벤트를 생성하며, 이러한 과정을 보통 emitting(방출)이라고 표현한다.
- 각각의 이벤트들은 숫자나, 인스턴스 같은 값을 가지거나, 탭과 같은 제스처를 인식할 수도 있다.
기본적으로 아래와 같다.
public enum Event<Element> { /// Next elemet is produced. case next(Element) /// Sequence terminated with an error. case error(Swift.Error) /// Sequence completed successfully. case completed }
Observable 생성
새로운 Observable을 만드는 연산자들
- Create — 직접적인 코드 구현을 통해 옵저버 메서드를 호출하여 Observable을 생성한다
- Defer — 옵저버가 구독하기 전까지는 Observable 생성을 지연하고 구독이 시작되면 옵저버 별로 새로운 Observable을 생성한다 // lazy var와 비슷한 형식이다.
- Empty/Never/Throw — 아주 정확하고 제한된 행동을 하는 Observable을 생성한다
- From — 다른 객체나 자료 구조를 Observable로 변환한다
- Interval — 특정 시간별로 연속된 정수형을 배출하는 Observable을 생성한다
- Just — 객체 하나 또는 객채집합을 Observable로 변환한다. 변환된 Observable은 원본 객체들을 발행한다
- Range — 연속된 범위(Range)의 정수를 발행하는 Observable을 생성한다
- Repeat — 특정 항목이나 연속된 항목들을 반복적으로 배출하는 Observable을 생성한다
- Start — 함수의 실행 결과를 배출하는 Observable을 생성한다
- Timer — 지정된 시간이 지나고 난 후 항목을 하나 배출하는 Observable을 생성한다
Observable 변환
Observable이 배출한 항목들을 변환하는 연산자들
- Buffer — Observable로부터 정기적으로 항목들을 수집하고 묶음으로 만든 후에 묶음 안에 있는 항목들을 한번에 하나씩 배출하지 않고 수집된 묶음 단위로 배출한다
- FlatMap — 하나의 Observable이 발행하는 항목들을 여러개의 Observable로 변환하고, 항목들의 배출을 차례차례 줄 세워 하나의 Observable로 전달한다
- GroupBy — 원본 Observable이 배출하는 항목들을 키(Key) 별로 묶은 후 Observable에 담는다. 이렇게 키 별로 만들어진 Observable들은 자기가 담고 있는 묶음의 항목들을 배출한다
- Map — Observable이 배출한 항목에 함수를 적용한다
- Scan — Observable이 배출한 항목에 연속적으로 함수를 적용하고 실행한 후 성공적으로 실행된 함수의 리턴 값을 발행한다
- Window — 정기적으로 Observable의 항목들을 더 작은 단위의 Observable 윈도우로 나눈 후에, 한번에 하나씩 항목들을 발행하는 대신 작게 나눠진 윈도우 단위로 항목들을 배출한다
Observable 필터링
소스 Observable에서 선택적으로 항목을 배출하는 연산자들
- Debounce — Observable의 시간 흐름이 지속되는 상태에서 다른 항목들은 배출하지 않고 특정 시간 마다 그 시점에 존재하는 항목 하나를 Observable로부터 배출한다
- Distinct — Observable이 배출하는 항목들 중 중복을 제거한 항목들을 배출한다
- ElementAt — Obserable에서 n번째 항목만 배출한다
- Filter — 테스트 조건을 만족하는 항목들만 배출한다
- First — 맨 첫 번째 항목 또는 조건을 만족하는 첫 번째 항목만 배출한다
- IgnoreElements — 항목들을 배출하지는 않고 종료 알림은 보낸다
- Last — Observable의 마지막 항목만 배출한다
- Sample — 특정 시간 간격으로 최근에 Observable이 배출한 항목들을 배출한다
- Skip — Observable이 배출한 처음 n개의 항목들을 숨긴다
- SkipLast — Observable이 배출한 마지막 n개의 항목들을 숨긴다
- Take — Observable이 배츨한 처음 n개의 항목들만 배출한다
- TakeLast — Observable이 배출한 마지막 n개의 항목들만 배출한다
Observables 결합
여러 개의 소스 Observable들을 하나의 Observable로 만드는 연산자들
- And/Then/When — 두 개 이상의 Observable들이 배출한 항목들을 'Pattern'과 'Plan' 중계자를 이용해서 결합한다
- CombineLatest — 두 개의 Observable 중 하나가 항목을 배출할 때 배출된 마지막 항목과 다른 한 Observable이 배출한 항목을 결합한 후 함수를 적용하여 실행 후 실행된 결과를 배출한다
- Join — A Observable과 B Observable이 배출한 항목들을 결합하는데, 이때 B Observable은 배출한 항목이 타임 윈도우를 가지고 있고 이 타임 윈도우가 열린 동안 A Observable은 항목의 배출을 계속한다. Join 연산자는 B Observable의 항목을 배출하고 배출된 항목은 타임 윈도우를 시작시킨다. 타임 윈도우가 열려 있는 동안 A Observable은 자신의 항목들을 계속 배출하여 이 두 항목들을 결합한다
- Merge — 복수 개의 Observable들이 배출하는 항목들을 머지시켜 하나의 Observable로 만든다
- StartWith — 소스 Observable이 항목을 배출하기 전에 다른 항목들을 앞에 추가한 후 배출한다
- Switch — Observable들을 배출하는 Observable을 싱글 Observable로 변환하다. 변환된 싱글 Observable은 변환 전 소스 Observable들이 배출한 항목들을 배출한다
- Zip — 명시한 함수를 통해 여러 Observable들이 배출한 항목들을 결합하고 함수의 실행 결과를 배출한다
오류 처리 연산자
Observable이 던진 오류를 복구할 수 있도록 도와주는 연산자들
- Catch — 오류를 무시하고 배출되는 항목들을 계속 진행시켜 'onError'로부터 전달된 오류를 복구한다
- Retry — 만약 소스 Observable이 'onError' 알림을 보낼 경우, 오류 없이 실행이 완료되기를 기대하며 재구독을 시도한다
Observable 유틸리티 연산자
Obserable과 함께 동작하는 유용한 도우미 연산자들
- Delay — Observable의 배출을 특정 시간동안 미룬다
- Do — Observable의 생명주기 동안 발생하는 여러 이벤트에서 실행 될 액션을 등록한다
- Materialize/Dematerialize — 배출된 항목이 어떤 알림을 통해 옵저버에게 전달 됐는지를 표현하며, 그 반대 과정을 수행할 수 있다
- ObserveOn — 옵저버가 어느 스케줄러 상에서 Observable을 관찰할지 명시한다
- Serialize — Observable이 직렬화된 호출을 생성하고 제대로 동작하도록 강제한다
- Subscribe — Observable이 배출하는 항목과 알림을 기반으로 동작한다
- SubscribeOn — Observable을 구독할 때 사용할 스케줄러를 명시한다
- TimeInterval — 항목들을 배출하는 Observable을, 항목을 배출하는데 걸린 시간이 얼마인지를 가리키는 Observable로 변환한다
- Timeout — 소스 Obvservable을 그대로 전달하지만, 대신 특정 시간 동안 배출된 항목이 없으면 오류 알림을 보낸다
- Timestamp — Observable이 배출한 항목에 타임 스탬프를 추가한다
- Using — 소스 Observable과 동일한 생명주기를 갖는 Observable을 생성하는데, 이 Observable은 생명주기가 완료되면 리소스를 종료하고 반환한다
조건과 불린 연산자(Boolean)
하나 이상의 Observable 또는 Observable이 배출한 항목을 평가하는 연산자들
- All — Observable이 배출한 전체 항목들이 어떤 조건을 만족시키는지 판단한다
- Amb — 두 개 이상의 소스 Observable이 주어 질때, 그 중 첫 번째로 항목을 배출한 Observable이 배출하는 항목들을 전달한다
- Contains — Observable이 특정 항목을 배출하는지 아닌지를 판단한다
- DefaultIfEmpty — 소스 Observable이 배출하는 항목을 전달한다. 만약 배출되는 항목이 없으면 기본 항목을 배출한다
- SequenceEqual — 두 개의 Observable이 항목을 같은 순서로 배출하는지 판단한다
- SkipUntil — 두 번째 Observable이 항목을 배출하기 전까지 배출된 항목들을 버린다
- SkipWhile — 특정 조건이 false를 리턴하기 전까지 Observable이 배출한 항목들을 버린다
- TakeUntil — 두 번째 Observable이 항목을 발행하기 시작햤거나 두 번째 Observable이 종료되면 그 때부터 발행되는 항목들은 버린다
- TakeWhile — 특정 조건이 false를 리턴하기 시작하면 그 이후에 배출되는 항목들을 버린다
수학과 집계 연산자
Observable이 배출하는 항목 전체를 대상으로 동작하는 연산자들
- Average — Observable이 발행한 항목의 평균 값을 발행한다
- Concat — 두 개 이상의 Observable들이 항목을 발행할 때 Observable 순서대로 배출하는 항목들을 하나의 Observable 배출로 연이어 배출한다
- Count — 소스 Observable이 발행한 항목의 개수를 배출한다
- Max — Observable이 발행한 항목 중 값이 가장 큰 항목을 배출한다
- Min — Observable이 발행한 항목 중 값이 가장 작은 항목을 배출한다
- Reduce — Observable이 배출한 항목에 함수를 순서대로 적용하고 함수를 연산한 후 최종 결과를 발행한다
- Sum — Observable이 배출한 항목의 합계를 배출한다
역압(Backpressure) 연산자
- backpressure operators — 옵저버가 소비하는 것보다 더 빠르게 항목들을 생산하는 Observable을 복재하는 전략
연결 가능한 Observable 연산자
좀 더 정확히 제어되는 구독 역학을 가진 전문 Observable들
- Connect — 구독자가 항목 배출을 시작할 수 있도록 연결 가능한 Observable에게 명령을 내린다
- Publish — 일반 Observable을 연결 가능한 Observable로 변환한다
- RefCount — 일반 Observable처럼 동작하는 연결 가능한 Observable을 만든다
- Replay — 비록 옵저버가 Observable이 항목 배출을 시작한 후에 구독을 했다 하더라도 배출된 모든 항목들을 볼 수 있도록 한다
Observable 변환 연산자
- To — Observable을 다른 객체나 자료 구조로 변환한다
자주쓰는 내용들만 정리해둔것 같다. 여기 있는 내용만 알아도 원하는 모든것을 사용할 수 있겠지만, 혹시 더 필요하거나 모르는 내용이 있으면 출처인 맨 위의 링크를 타고 들어가면 된다.
++ 추가사항
debug
혹시 구독 전에 print 등 tracking 하고 싶은게 있다면
observable .debug("debug 내용") .disposed(by: disposeBag)
Single
네트워크 결과 처리할때 보았던 Single
- .success(value) 또는 .error 이벤트를 방출한다. (단일요소 또는 에러 방출)
- .success(value) = .next + .completed
유의점 Single을 사용해야 한다면, Single로 시작하도록 하는것이 불필요한 에러를 줄이는 방안.
728x90'RxSwift' 카테고리의 다른 글
Combining Operators (0) 2021.08.06 Transforming Operators (0) 2021.08.05 RxSwift 스터디 계획 따라가기 (0) 2021.07.12 RxSwift Subject (0) 2021.07.09 Rxswift Debounce / Throttle (0) 2021.06.29