1. toArray

2. map

3. enumerated + map

index가 3의 배수인 것만 출력하고 나머지는 0으로 방출

example(of: "map + enumereated") {
    Observable.of(1,2,3,4,5,6,7,8)
        .enumerated()
        .map { (index: Int, element: Int)   in
            if index % 3 == 0{
                return (index,element)
            }
            return (index,0)
        }.subscribe(
            onNext:{print($0)}
        ).disposed(by: disposeBag)
}
--- Example of:map + enumereated---
(0, 1)
(1, 0)
(2, 0)
(3, 4)
(4, 0)
(5, 0)
(6, 7)
(7, 0)

Transforimg inner observalbles

flatMap

새로운 Observable를 생성하여 변경 Obaservable<String>.just(Strint($0))

map → event 값을 변경

flatMap → observable 자체를 변경한다는 차이가 있음

example(of: "flatMap vs Map") {
    Observable<Int>.just(10)
        .map{ element in
            String(element)
        }.subscribe{
            print($0)
        }.disposed(by: disposeBag)
    
    Observable<Int>.just(10)
        .flatMap { element in
            Observable<String>.just(String(element))
        }.subscribe{
            print($0)
        }.disposed(by: disposeBag)
}

FlatMapLatest

FlatMap과는 다르게 가장 최신으로 만들어진 Sequence만 Emit다.

example(of :"faltMapLatest"){
    let js = Student(score: BehaviorSubject(value: 80))
    let jh = Student(score: BehaviorSubject(value: 90))
    
    let student = PublishSubject<Student>()
    
    student
        .flatMapLatest{
            $0.score
        }.subscribe(
            onNext:{print($0)}
        ).disposed(by: disposeBag)
    
    student.onNext(js)
    js.score.onNext(85)
    student.onNext(jh)
    
    js.score.onNext(95)//js가 방출한 이벤트는 더이상 emit하지 않음
    jh.score.onNext(100)
}
/*
--- Example of:faltMapLatest---
80
85
90
100
**/

Observing Events

Materialize

→ 이벤트 타입으로 변환 후, Observable 형으로 나타내는 것 Observable<Event<Int>>