RxSwift

RxViewController

motosw3600 2022. 3. 3. 16:24

RxViewController

  • UIViewController를 생명주기를 RxSwift와 결합해 사용할 수 있는 라이브러리
  • 기존 viewWillAppear, viewDidLoad등 UIViewController의 Lifycyle함수를 쉽게 사용하는 syntax sugar
  • devxoul님이 만드신 오픈소스 라이브러리

RxViewController 구현부

RxViewController가 어떻게 구현되어 있는지 확인해보자

 

#if os(iOS) || os(tvOS)
import UIKit

import RxCocoa
import RxSwift

public extension Reactive where Base: UIViewController {
  var viewDidLoad: ControlEvent<Void> {
    let source = self.methodInvoked(#selector(Base.viewDidLoad)).map { _ in }
    return ControlEvent(events: source)
  }

  var viewWillAppear: ControlEvent<Bool> {
    let source = self.methodInvoked(#selector(Base.viewWillAppear)).map { $0.first as? Bool ?? false }
    return ControlEvent(events: source)
  }
  var viewDidAppear: ControlEvent<Bool> {
    let source = self.methodInvoked(#selector(Base.viewDidAppear)).map { $0.first as? Bool ?? false }
    return ControlEvent(events: source)
  }

  var viewWillDisappear: ControlEvent<Bool> {
    let source = self.methodInvoked(#selector(Base.viewWillDisappear)).map { $0.first as? Bool ?? false }
    return ControlEvent(events: source)
  }
  var viewDidDisappear: ControlEvent<Bool> {
    let source = self.methodInvoked(#selector(Base.viewDidDisappear)).map { $0.first as? Bool ?? false }
    return ControlEvent(events: source)
  }
  ...

 

Reative의 Extension으로 UIViewController를 특정한 Base를 가지고 확장(rx.viewDidLoad로 접근가능)

ControlEvent로 UIViewController의 Lifecycle func을 Observable한 events를 전달

RxViewController의 사용법

self.rx.viewDidLoad
   .subscribe(onNext: {
      print("viewDidLoad !!")
})
  
self.rx.viewWillAppear
   .subscribe(onNext: {
      print("viewWillAppear !!")
})

 

위의 예제처럼 viewDidLoad나 viewWillAppear에서 수행해야될 부분을 따로 override func없이 rx로 해결할 수 있다는 부분이 좋은 것같다. ex) 화면이 보여지기전에 새로운 데이터를 업데이트할 경우 등등..

 

 

출처

https://github.com/devxoul/RxViewController

'RxSwift' 카테고리의 다른 글

RxFlow  (0) 2022.03.30
Operator  (0) 2022.02.09
Subject  (0) 2022.02.08
Observable  (0) 2022.02.07
RxSwift란?  (0) 2022.02.07