iOS

RxSwift(2) - 연산

홍복치 2020. 4. 4. 01:53

KxCoding의 Mastering RxSwift 유투브를 보며 공부한 내용을 정리

just, of, from

(1) just

- 하나의 항목을 방출하는 Observable 생성 시 사용

※ 중요 : 파라미터로 전달한 요소를 그대로 방출

 

[코드]

let disposeBag = DisposeBag()
let element = "😀"

Observable.just(element)
   .subscribe { event in print(event) }
   .disposed(by: disposeBag)

Observable.just([1, 2, 3])
   .subscribe { event in print(event) }
   .disposed(by: disposeBag)

 

[출력]

next(😀)
completed
next([1, 2, 3])
completed

 

 

(2) Of

- 두 개 이상의 항목을 방출하는 Observable 생성 시 사용

※ 중요 : 파라미터로 전달한 요소를 그대로 방출

 

[코드]

let disposeBag = DisposeBag()
let apple = "🍏"
let orange = "🍊"
let kiwi = "🥝"


// next이벤트가 3번 방출 후 completed
Observable.of(apple, orange, kiwi)
   .subscribe { element in print(element) }
   .disposed(by: disposeBag)

// 배열이 그대로 방출
// 배열의 인자를 하나씩 방출하고 싶다면 어떻게 해야할까? -> from

Observable.of([1, 2], [3, 4], [5, 6])
   .subscribe { element in print(element) }
   .disposed(by: disposeBag)

 

[출력]

next(🍏)
next(🍊)
next(🥝)
completed
next([1, 2])
next([3, 4])
next([5, 6])
completed

 

 

(3) From

- 배열 안 요소를 하나씩 방출하고 싶을 때 사용

 

[코드]

let disposeBag = DisposeBag()
let fruits = ["🍏", "🍎", "🍋", "🍓", "🍇"]

// 파라미터를 배열로 받아 하나씩 방출
Observable.from(fruits)
   .subscribe { element in print(element) }
   .disposed(by: disposeBag)

 

[출력]

next(🍏)
next(🍎)
next(🍋)
next(🍓)
next(🍇)
completed

 

 

Filter

- 조건에 해당하는 데이터만 뽑아낼 때 사용

 

 

[코드] 

짝수만 출력하는 코드

let disposeBag = DisposeBag()
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


Observable.from(numbers)
    .filter { $0.isMultiple(of: 2) }
    .subscribe { print($0) }
    .disposed(by: disposeBag)

 

[출력]

next(2)
next(4)
next(6)
next(8)
next(10)
completed

 

 

 

FlatMap

 

 

 

- 원본 Observable이 항목을 방출하면 FlatMap연산자가 변환함수를 실행

- 변환함수는 방출된 항목을 Observable로 변환

- 방출된 항목의 값이 바뀌면 flatmap연산자가 반환한 Observable이 새로운 항목을 방출(ex : 빨간색 다이아몬드 두 개)

- 모든 Observable이 방출하는 항목을 모아서 최종적으로 하나의 Observable 리턴

- 개별항목이 개별 Observable로 변환되었다가 다시 하나의 Observable로 합쳐짐

 

 

 

 

[코드]

let a = BehaviorSubject(value: 1)
let b = BehaviorSubject(value: 2)

//BehaviorSubject를 방출하는 PublishSubject생성
let subject = PublishSubject<BehaviorSubject<Int>>()


//구독자로 전달되는 것은 BehaviorSubject
subject
    .flatMap{ $0.asObservable() } //Subject -> Observable
    .subscribe{ print($0) }
    .disposed(by: disposeBag)

subject.onNext(a)
subject.onNext(b)

a.onNext(11)
b.onNext(22)

 

※ BehaviorSubject

- 무조건 초기값을 가지고 초기화해야 함

- Subscribe가 발생 시, 구독 이전에 발생한 이벤트 중 가장 최신의 이벤트를 전달받음