티스토리 뷰

Swift

[RxSwift] toArray, map, flatMap, flatMapLatest

Kim_Baechu 2020. 12. 23. 14:20

toArray

let disposeBag = DisposeBag()

Observable.of(1, 2, 3, 4, 5)
    .toArray()
    .subscribe({
        print($0)
    }).disposed(by: disposeBag)

//success([1, 2, 3, 4, 5])

toArray는 배열로 만들어줍니다.

 

Map

let disposeBag = DisposeBag()

Observable.of(1, 2, 3, 4, 5)
    .map { $0 * 2 }
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)

//2
//4
//6
//8
//10

Map은 새로운 이벤트로 변경해줍니다.

 

예시

  self.myTextField.rx.controlEvent(.editingDidEndOnExit)
     .asObservable()
         .map { self.myTextField.text }
         .subscribe(onNext: { text in
             
             if let text = text {
                 if myTextField.isEmpty {
                     print("nil")
                 } else {
                     print(text)
                 }
             }
    
         }).disposed(by: disposeBag)
      

 

FlatMap

let disposeBag = DisposeBag()

struct Student {
    var score: BehaviorRelay<Int>
}

let john = Student(score: BehaviorRelay(value: 75))
let mary = Student(score: BehaviorRelay(value: 95))

let student = PublishSubject<Student>()

student.asObservable()
    .flatMap { $0.score.asObservable() }
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)

student.onNext(john)
john.score.accept(100)

student.onNext(mary)
mary.score.accept(80)
john.score.accept(40)

//75
//100
//95
//80
//40

FlatMap은 구성 요소 하나하나 observable로 만들어서 방출합니다.
Student에 존과 매리가 있는데 각각의 변화를 계속해서 감지해서 변화된 값을 보여줍니다.

FlatMap은 이러한 observable의 결과를 병합하여 하나의 시퀀스로 내보냅니다.

student를 통해서 2개의 observable(존과 매리)를 함께 전달할 수 있습니다.

 

FlatMapLatest

student.asObservable()
    .flatMapLatest { $0.score.asObservable() }
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)

student.onNext(john)
john.score.accept(100)

student.onNext(mary)
mary.score.accept(80)

john.score.accept(40)

//75
//100
//95
//80

FlatMapLatest는 FlatMap과 유사하나 마지막 observable만 관찰합니다.그래서 student.onNext(mary)한 이후에john의 값을 변경해도 반영이 되지 않습니다.

댓글
공지사항