1. RxSwift?

What is RxSwift?

reactivex_logo

Reactive eXtension Swift → RxSwift

RxSwfit 란 Swift에 반응형 프로그래밍을 더해 비동기&이벤트를 위한 코드로 구성된 라이브러리이다

반응형 프로그래밍(Reactive Programming) : 비동기적 데이터 흐름을 처리하는 프로그래밍 패러다임 모든 것을 비동기적인 데이터의 Stream으로 간주하고, Observer 디자인 패턴을 활용해 비동기 이벤트를 처리하는 것이 핵심

Why RxSwift?

1. 비동기 처리

  • Swift에도 비동기 처리를 지원하는 API들이 존재하지만(Closure, Delegate Pattern, Notification), 이러한 API를 사용하여 코드를 구성하면 데이터에 변경사항이 생긴후 해당 변경사항을 명시해준뒤, 다시 UI를 업데이트 해야하기 때문에 기능이 많아지고 처리해야할 데이터가 많아질수록 관리가 어렵고 번거롭다는게 단점이다.

  • 하지만 RxSwift는 데이터가 변경되면 UI업데이트 로직을 알아서 처리해준다. 데이터가 변경되는 것을 관찰(Observe)하고 있기 때문이다.

2. Thread 처리

  • 데이터를 받아오는 과정, 흔히 말하는 콜백(CallBack)지옥에서 벗어날수있다
  • UI이벤트, 네트워크 처리 등의 데이터를 갱신했을 때의 처리가 쉬워짐

3. MVVM

  • 데이터 바인딩을 제공하는 플랫폼에서 만들어진 이벤트 중심 프로그램을 위해 개발된 RxSwift는 MVVM패턴과 연관성이 높다

RxSwift_MVVM

Rx의 3요소

1. Observables

  • 이벤트를 시각적인 흐름에 따라 전달하는 전달자 역할
  • 비동기로 동작하는 어떠한 데이터들의 흐름, 시퀀스
  • 이 Observable을 구독하는 옵저버들은 이벤트들을 받아 적절한 처리를 할 수 있게됨

event 종류 : next, completed, error

example code

// 디바이스를 가로로 할지, 세로로 할지 정하는 코드
UIDevice.rx.orientation
  .subscribe(onNext: { current in
    switch current {
    case .landscape:
      // Re-arrange UI for landscape
    case .portrait:
      // Re-arrange UI for portrait
    }
  })

주요 method

  • just : 하나의 요소를 방출하는 Observable 생성
  • of: 두개 이상의 요소를 방출하는 Observable 생성
  • from: 배열에 저장된 요소를 순차적으로 하나씩 방출하는 옵저버블 생성

2. Operators

  • 옵저버에서 방출되는 결과를 변환하고, 처리할 수 있게 만들어줌
  • operator group
  • Filtering Operator : .filter, .skip, .skipWhile, .take, takeWhile, throttle(:_scheduler) …
  • Transforming Operator : .map(), flatMap(), flatMapLatest() …
  • Combining Operator : .concat(_:), .merge(), .combineLatest() , zip() …

example code

searchBar.rx.text
    .filter { $0 != nil } //text가 nild이 아닌경우만 가져옴
    .throttle(0.5, scheduler: MainScheduler.instance) // 0.5초 동안 발생한 가장최신의 이벤트를 사용
    .map { SearchRequest(query: $0, page: 1) } // text를 SearchRequest 캐스팅
    .bind(to: viewModel.searchRelay)
    .disposed(by: disposeBag)

3.Schedulers

  • 기존에 사용하던 DispatchQueue와 동일한 기능
  • 프로세스가 있는 곳의 context( = thread)

RxSwift_scheduler

scheduler 종류

  • MainScheduler
    • 메인 쓰레드에서 가장위에 존재(UI와 high-priority tasks를 진행)
    • UI를 갱신하려면 이스케줄러를 변경하여 사용
  • SerialDispatchQueueScheduler
    • background에서 추출하는 일을 처리할 때 사용
    • MainScheduler는 SerialDispatchQueueScheduler의 인스턴스중 하나임
  • ConcurrentDispatchQueueScheduler
    • 작업량이 많은일에 사용 (병렬적 추출)
  • OperationQueueScheduler
    • NSOperationQueue에서 실행되어야 할 작업을 처리함
    • 백그라운드에서 작업을 조정하고 싶을 때 사용하며 maxConcurrentOperationCount로 작업을 조정함
  • TestScheduler
    • 테스트를 위한것, production code에 사용하지 않음
  • CustomScheduler

example code

Observable<Int>.of(1,2,3,4,5)
            .subscribe(on: CurrentThreadScheduler.instance)
            .observe(on: MainScheduler.instance)
            .map { 
                print("main 에서 실행 됨")
                print($0)
            }
            .observe(on: ConcurrentDispatchQueueScheduler.init(qos: .background))
            .subscribe({
                print("Concurrent background에서 실행됨")
                print($0)
            })
            .disposed(by: disposeBag)

References

RxSwift) Scheduler (velog.io)

https://ios-development.tistory.com