RxSwift 시작하기(Operator) - 6

DevelopRecord·2022년 7월 22일
0

RxSwift

목록 보기
6/7

오늘은 다양한 Operator들에 대해 알아볼게요.

바로 시작할게요.

생성

1. create

Observable을 생성하는 가장 기본이 되는 Operator입니다.

let create = Observable<Int>.create { observer in
    observer.onNext(1)
    observer.onNext(2)
    observer.onCompleted()
    observer.onNext(3)
    return Disposables.create()
}
create.subscribe { event in
    print(event)
}

2. just

특정 데이터 항목을 하나만 빠르고 간단하게 생성할 수 있습니다.

let just = Observable.just([1, 2])
let justOb = just.asObservable()
justOb.subscribe { event in
    print(event)
}

3. from

just와 비슷하지만 한번에 모든 데이터를 출력하는 just와 달리,
from은 결과를 하나씩 방출합니다.

let from = Observable.from([1, 2, 3])
let fromOb = from.asObservable()
fromOb.subscribe { event in
    print(event)
}

next(1)
next(2)
next(3)
completed

4. of

of는 데이터를 한번에 방출할수도, 하나씩 방출할수도 있습니다.

let of = Observable.of(1, 2, 3) // 하나씩
let of2 = Observable.of([1, 2, 3]) // 한번에
of.subscribe { event in
	print(event)
}

변형

1. map

방출한 결과를 원하는 형태로 변형해서 값을 방출시킬 수 있습니다.

let mapFrom = Observable.from([0, 1, 2]).map { $0 * 2 }
let mapFromOb = mapFrom.asObservable()
mapFromOb.subscribe { event in
    print(event)
}

next(0)
next(2)
next(4)
completed

2. flatMap

이벤트를 다른 Observable로 변형시킵니다.

let ofStrOne = Observable.of(["안", "녕", "하", "세", "요", "."])
let ofStrTwo = Observable.of(["반", "갑", "습", "니", "다", "!"])
ofStrOne
.flatMap { str -> Observable<[String]> in
    return ofStrTwo
}
.subscribe { event in
    print("event: \(event)")
}

next(["반", "갑", "습", "니", "다", "!"])
completed

3. scan

이전에 방출된 값과 새롭게 방출된 값을 합쳐서 방출합니다.
즉, 값을 누적시켜서 방출시킵니다.

let scan = Observable.of(0, 1, 2, 3, 4).asObservable()
scan.scan(0) { prevValue, newValue in
    print("prevValue: \(prevValue), newValue: \(newValue), prevValue + newValue: \(prevValue + newValue)")
    return prevValue + newValue
}
.subscribe { event in
    print(event)
}
.disposed(by: disposeBag)

prevValue: 0, newValue: 0, prevValue + newValue: 0
next(0)
prevValue: 0, newValue: 1, prevValue + newValue: 1
next(1)
prevValue: 1, newValue: 2, prevValue + newValue: 3
next(3)
prevValue: 3, newValue: 3, prevValue + newValue: 6
next(6)
prevValue: 6, newValue: 4, prevValue + newValue: 10
next(10)
completed

필터링

1. filter

조건에 맞는 값을 필터링하여 방출시킵니다.

let filter = Observable.of(1, 3, 5, 6, 9).filter { n in
    n % 2 == 0
}
filter.subscribe { event in
    print(event)
}

next(6)
completed

2. first

방출한 결과의 첫번째 값을 옵셔널로 방출합니다.

let first = Observable.of(1, 2, 3).first()
first.subscribe { event in
    print(event)
}

success(Optional(1))

3. take

방출한 결과를 첫번째부터 N번째까지 방출합니다.

let take = Observable.from([1, 2, 3]).take(1).subscribe { event in print(event) }

next(1)

4. takeLast

방출한 결과를 끝에서부터 N번째까지 방출합니다.

let takeLast = Observable.from([1, 2, 3]).takeLast(2).subscribe { event in print(event) }

next(2)
next(3)
completed

5. elementAt

let elementAt = Observable.from([1, 2, 3]).element(at: 1).subscribe { event in print(event) }

방출한 결과의 특정 인덱스에 접근하여 방출합니다.

next(2)
completed

결합

1. merge

두 Observable의 결과값을 하나로 합쳐줍니다.
여러 시퀀스를 합치는 것도 가능하며, 먼저오는 이벤트들을 바로 전달시켜줍니다.

let obInt = Observable.of(1, 2, 3)
let obInt2 = Observable.of(4, 5, 6)
let merge = Observable.of(obInt, obInt2).merge().subscribe { event in print(event) }

next(1)
next(2)
next(4)
next(3)
next(5)
next(6)
completed

2. CombineLatest

두 개 이상의 시퀀스에서 가장 최근의 값끼리 하나의 값으로 합쳐줍니다.
이렇게 합쳐진 시퀀스는 서브 시퀀스에서 이벤트가 발생할 때 마다 이벤트를 발생시킵니다.
즉, name, age, gender 서브 시퀀스 중 하나라도 값이 변경되는 이벤트가 발생하면 합쳐진 시퀀스에 조합하여 새로운 요소를 전달합니다.

let name = PublishSubject<String>()
let age = PublishSubject<Int>()
let gender = PublishSubject<String>()

let combineLatest = Observable.combineLatest(name, age, gender)// { name, age, gender in print(name, age, gender) }
combineLatest.subscribe { print($0) }

name.onNext("철수")
age.onNext(5)
gender.onNext("남")

name.onNext("훈이")

next(("철수", 5, "남"))
next(("훈이", 5, "남"))

기존의 name 시퀀스에 철수라는 값이 들어있지만, 훈이라는 이벤트가 발생되어 next(("훈이", 5, "남")) 이라는 새로운 요소를 전달했습니다.

3. Zip

CombineLatest와 굉장히 유사하지만, CombineLatest와 서브시퀀스 모두 첫 이벤트를 발생시키면 그 이후에는 하나의 시퀀스에서만 이벤트가 발생해도 클로저가 수행되었지만,
Zip에서는 Zip과 서브시퀀스 모두 첫 이벤트를 발생시키고 난 이후에도 모든 서브시퀀스에서 이벤트가 발생해야 합쳐진 시퀀스에 이벤트가 발생합니다.

let name = PublishSubject<String>()
let age = PublishSubject<Int>()
let gender = PublishSubject<String>()

let zip = Observable.zip(name, age, gender)
zip.subscribe { print($0) }

name.onNext("짱구")
age.onNext(5)
gender.onNext("남")

name.onNext("맹구")
age.onNext(5)
gender.onNext("남")

next(("짱구", 5, "남"))
next(("맹구", 5, "남"))

RxSwift에서 제공하는 다양한 Operator에 대해 정리해보았습니다.
이 외에도 너무 많지만, 여기서 한번 끊고 익힌 뒤에 다른 Operator들도 정리해 보겠습니다.

잘못된 정보가 있으면 언제든 지적해 주세요.

0개의 댓글