[RxSwift] Relay - PublishRelay, BehaviorRelay, ReplayRelay
[RxSwift] Subject - PublishSubject, BehaviorSubject, ReplaySubject, AsyncSubject [RxSwift] Create Operators (1) just, of, from, range, empty, never [RxSwift] Create Operators (2) create 그리고 Dispose [RxSwift] Create Operators (3) defer [RxSwift] Trait
swifty-cody.tistory.com
지난글에서 정리한 Relay를 마지막으로,
Observable, Subject, Relay까지 정리를 다 했습니다.
우리가 서버로부터 fetch해온 JSON데이터를 파싱하고 가공해서 사용하듯이,
생성한 Observable(혹은 Subject, Relay. 이하 Observable)을 Subscribe해서
방출된 값을 사용하기 전에 값을 가공해서 사용해야하는데,
RxSwift에서는 이를 위한 다양한 operator들을 제공하고 있습니다.
(https://reactivex.io/documentation/operators.html)
값을 선택적으로 받기 위한 Filtering Operator부터 정리해봅니다.
filter
Swift Collection 타입에서 제공하는 filter와 동일한 기능의 Operator입니다.
filter클로저에서 true인 케이스의 next이벤트를 받도록 합니다.
let disposeBag = DisposeBag()
print("- - - - - filter - - - - -")
Observable.of("MintChoco", "Wasabi", "MintChoco", "HoneyButter", "MintChoco", "MintChoco")
.filter { $0 != "MintChoco" }
.subscribe(onNext: {
print("eat", $0, "Almond")
})
.disposed(by: disposeBag)
(출력)
- - - - - filter - - - - -
eat Wasabi Almond
eat HoneyButter Almond
ignoreElements
모든 next이벤트를 무시합니다. error, complete로 종료되는 이벤트만 받습니다.
ignoreElements의 예시입니다.
print("- - - - - ignoreElements - - - - -")
let takeAlmond = PublishSubject<String>()
takeAlmond
.ignoreElements()
.subscribe {
print("take Wasabi Almond")
}
.disposed(by: disposeBag)
takeAlmond.onNext("MintChoco Almond is here")
takeAlmond.onNext("MintChoco Almond is here")
takeAlmond.onNext("MintChoco Almond is here")
takeAlmond.onCompleted()
(출력)
- - - - - ignoreElements - - - - -
take Wasabi Almond
elementAt
subscribe한 후 n번째 인덱스의 Element만 받습니다.
elementAt의 예시
print("- - - - - elementAt - - - - -")
let reTakeAlmond = PublishSubject<String>()
reTakeAlmond
.element(at: 2)
.subscribe(onNext: {
print("eat", $0, "Almond")
})
reTakeAlmond.onNext("MintChoco")
reTakeAlmond.onNext("MintChoco")
reTakeAlmond.onNext("Wasabi")
reTakeAlmond.onNext("MintChoco")
(출력)
- - - - - elementAt - - - - -
eat Wasabi Almond
skip
n번 next이벤트를 skip시킵니다.
print("- - - - - skip - - - - -")
Observable.of("MintChoco", "MintChoco", "MintChoco", "HoneyButter", "Wasabi", "Buldak")
.skip(3)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
(출력)
- - - - - skip - - - - -
HoneyButter
Wasabi
Buldak
skipWhile
while클로저가 true인 동안 skip을 시키고, false가 된 순간부터 next이벤트를 받습니다.
print("- - - - - skipWhile - - - - -")
Observable.of("MintChoco", "MintChoco", "MintChoco", "HoneyButter", "Wasabi", "Corn")
.skip(while: {
$0 == "MintChoco"
})
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
(출력)
- - - - - skipWhile - - - - -
HoneyButter
Wasabi
Corn
skipUntil
skipUntil은 조금 특이합니다.
skipUntil은 다른 Observable을 트리거로 설정해서,
트리거로 설정한 Observable이 값을 방출할 때까지 skip을 시킵니다.
print("- - - - - skipUntil - - - - -")
let buyAlmond = PublishSubject<String>()
let soldoutMintChoco = PublishSubject<String>() // 트리거가 되어줄 PublishSubject
buyAlmond.skip(until: soldoutMintChoco)
.subscribe(onNext: {
print("buy", $0)
})
.disposed(by: disposeBag)
buyAlmond.onNext("MintChoco")
buyAlmond.onNext("MintChoco")
soldoutMintChoco.onNext("Soldout MintChoco")
buyAlmond.onNext("Wasabi")
buyAlmond.onNext("Corn")
buyAlmond.onNext("Buldak")
(출력)
- - - - - skipUntil - - - - -
buy Wasabi
buy Corn
buy Buldak
take
take는 n개의 Element만 받도록 합니다.
print("- - - - - take - - - - -")
Observable.of("Buldak", "Wasabi", "HoneyButter", "MintChoco", "MintChoco", "MintChoco")
.take(3)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
(출력)
- - - - - take - - - - -
Buldak
Wasabi
HoneyButter
takeWhile
takeWhile은 while클로저가 true인 동안만 Element를 받습니다.
print("- - - - - takeWhile - - - - -")
Observable.of("Buldak", "Wasabi", "HoneyButter", "MintChoco", "MintChoco", "MintChoco")
.take(while: {
$0 != "MintChoco" // MintChoco가 나오면 종료
})
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
(출력)
- - - - - takeWhile - - - - -
Buldak
Wasabi
HoneyButter
takeUntil
takeUntil은 skipUntil과 비슷하게,
다른 Observable을 트리거로 설정하여, 트리거로 설정한 Observable이 값을 방출할 때까지만 값을 받습니다.
print("- - - - - takeUntil - - - - -")
let eatAlmond = PublishSubject<String>()
let giveMintChoco = PublishSubject<String>()
eatAlmond
.take(until: giveMintChoco)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
eatAlmond.onNext("Wasabi")
eatAlmond.onNext("HoneyButter")
giveMintChoco.onNext("MintChoco가 왔어요")
eatAlmond.onNext("Buldak")
(출력)
- - - - - takeUntil - - - - -
Wasabi
HoneyButter
distinctUntilChanged
distinctUntilChanged는 기존에 받은 Element와 다른 Element가 들어왔을 때만 값을 받게 해주어
중복된 값을 받지 않도록 막아줍니다.
print("- - - - - distinctUntilChanged - - - - -")
Observable.of("Buldak", "Wasabi", "Wasabi", "HoneyButter", "MintChoco", "MintChoco", "MintChoco", "Wasabi")
.distinctUntilChanged()
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
(출력)
- - - - - distinctUntilChanged - - - - -
Buldak
Wasabi
HoneyButter
MintChoco
Wasabi