[RxSwift] RxSwift란?
iOS/RxSwift

[RxSwift] RxSwift란?

728x90

RxSwift란?

✨ 간단하게 알아보기

Bindings

: Dispatch Queue를 이용했던 것을 bind를 이용해 자동적으로 처리

Observable
   .combineLatest(
      firstName.rx.text,
      lastName.rx.text
   ) { $0 + " " + $1 }
   .map { "Greetings, \\($0)" }
   .bind(to: greetingLabel.rx.text)
   .disposed(by: disposeBag)

재시도

ex) api 통신 실패했을때 재시도 용이

func doSomethingIncredible(forWho: String) throws -> IncredibleThing
doSomethingIncredible(“me")
   .retry(3)

Delegate

: 훨씬 더 직관적으로 표현 가능

public func scrollViewDidScroll(scrollView: UIScrollView) { [weak self]
	self?.leftPositionConstraint.constant = scrollView.contentOffset.x self?.leftPositionConstraint.constant = scrollView.contentOffset.x
} 
self.resultsTableView.rx.contentOffset
.map { $0.x }
.bind(to: self.leftPositionConstraint.rx.constant)

비동기 API들

  • Notification Center
  • The delegate pattern
  • Grand Central Dispatch(GCD)
  • Closures
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated)
      makeUI()
      connectUIControls()
      fetchData()
      checkForChanges()
}

→ 비동기로 실행되어 내부적으로 어떻게 돌아가는지 인지하기 힘들다.

→ Rx는 이를 추적 가능하도록 해준다.

Benefits

  • Composable: 조합 가능
  • Reusable: 재사용 가능
  • Declarative: 선언형
  • Understandable and concise: 이해하기 쉽고, 간결함
  • Stable: 안정적
  • Less stateful
  • Without leaks

✨ 구성 요소

Observable

💟 Observable<T>
  • Rx 코드의 기반
  • T 형태의 데이터 snapshot을 '전달' 할 수 있는 일련의 이벤트를 비동기적으로 생성하는 기능
  • 하나 이상의 observers가 실시간으로 어떤 이벤트에 반응
  • 세 가지 유형의 이벤트만 방출
enum Event<Element> {
	case next(Element) // 1️⃣ 다음 데이터를 전달
	case error(Swift.Error) // 2️⃣ 에러와 함께 이벤트를 종료시킴
	case completed // 3️⃣ 성공적으로 일련의 이벤트를 종료시킴
 }
  • Finite Observable
Network.download(file: "<https://www>...") .subscribe(onNext: { data in //임시 파일에 데이터 추가 }, onError: { error in //사용자에게 에러 표현 }, onCompleted: { //다운로드 된 파일 사용 })
  • Infinite Observable
UIDevice.rx.orientation .subscribe(onNext: { current in switch current { case .landscape: // 가로모드 배치 case .portrait: // 세로모드 배치 } })

Operator

: Observable에는 복잡한 논리를 구현하기 위한 여러 메소드로 구성됨

→ 여러 메소드들이 조합되어 하나의 구문을 이룬다.

UIDevice.rx.orientation 
	.filter { value in
			return value != .landscape 
	}
	.map { _ in
			return "세로로만 볼거예요!"
	}
	.subscribe(onNext: { string in
			showAlert(text: string)
})

Scheduler

: Dispatch Queue와 동일하지만 훨씬 강력하고 쓰기 쉽다.

728x90