RxSwift

1. RxSwift란?

Daesiker 2021. 8. 23. 14:08
반응형

1. RxSwift

Rx는 Reactive eXtensions의 줄임말로 관찰 가능한 시퀀스를 사용하여 비동기식 프로그램 및 이벤트 기반 프로그램을 구성하기위한 오픈 소스 라이브러리이다. Micorsoft 사에서 만든 라이브러리로 swift 뿐만 아니라 Java, JS, .NET 등 많은 언어로 사용할 수 있도록 만들었다. 기존의 비동기 이벤트 기반의 프로그래밍을 보다 효율적으로 사용하려고 만든 라이브러리인데, Swift에서는 언어에 기본적으로 내장되어 있는 DispatchQueue를 이용해서 비동기 함수를 짰었다. 하지만 이 함수로 작성을 하게되면 내용이 적으면 상관이 없지만 내용이 많으면 많을 수록 코드가 복잡해지고 가독성이 떨어진다는 단점이 있었다. 이 부분 때문에 RxSwift를 사람들의 관심을 끌게 된 이유인것 같다.

http://reactivex.io/

 

ReactiveX

CROSS-PLATFORM Available for idiomatic Java, Scala, C#, C++, Clojure, JavaScript, Python, Groovy, JRuby, and others

reactivex.io


2. RxSwift의 3가지 요소

1. Observables

Observable 클래스는 Rx 코드의 기반으로 T형태의 데이터를 전달할 수 있는 이벤트들을 비동기적으로 생성하는 기능이다. Observable은 딱 3가지 일만 한다.

  • next : 최신 / 다음 데이터를 전달하는 이벤트
  • completed : 성공적으로 일련의 이벤트들을 종료시키는 이벤트(추가적으로 이벤트를 생성하지 않음)
  • error : Observable이 에러를 발생시켰고 추가적으로 이번트를 생성하지 않음

Ex)

func checkString(_ text: String) -> Observable<String> {
        return Observable.create { result in
            
            if text.isEmpty {
                let error = NSError(domain: "공백을 입력하셨습니다.", code: 3, userInfo: nil)
                result.onError(error) //에러 발생
            } else {

                result.onNext(text) //넘겨줄 값 입력
            }
            result.onCompleted() //함수 종료
            
            
            return Disposables.create()
        }
    }

함수에서 리턴 타입을 Observable로 감싸서 정의하고 return Observable.create를 통해 Observable 타입의 값을 클로져 방식으로 만들면 된다. 자연스럽게 클로저 안의 인자는 맨처음 정의한 리턴타입을 그대로 따르기 때문에 여기서는 String 타입의 인자가 생성된다. 이제 함수 안에서 onNext(), onError(), onCompleted()를 사용해서 이벤트들을 비동기적으로 생성한다. 자세한건 다른 포스팅에서 다룰 예정이다.

2. Operator

ObservableType과 Observable 클래스에는 복잡한 논리를 구현하기 위해 많은 메서드가 포함되어 있다. 이 메서드들을 Operator라고 부른다. Operator는 비동기 입력을 받아 출력만 생성하기 때문에 Operator들끼리 쉽게 혼합해서 사용이 가능하다. Rx Operators들은 observable에 의해 들어온 값들을 처리하고 최종값이 나올 때 방출한다.

Ex)

Observable.merge(
            radioButton1.rx.tap.map { "선택1" },
            radioButton2.rx.tap.map { "선택2" },
            radioButton3.rx.tap.map { "선택3" },
            radioButton4.rx.tap.map { "선택4" },
            radioButton5.rx.tap.map { "선택5" },
            radioButton6.rx.tap.map { "선택6" },
            radioButton7.rx.tap.map { "선택7" },
            radioButton8.rx.tap.map { "선택8" },
            radioButton9.rx.tap.map { "선택9" },
            radioButton10.rx.tap.map { "선택10" }
        )
        .bind(to: vm.stepTwo.radioClick)
        .disposed(by: disposeBag)

버튼을 클릭하면 map Operator를 통해 "선택n"이라는 텍스트로 변환하여 radioClick에 연결을 시켜주는 함수인데 merge라는 Operator을 통해 10개의 버튼을 모두 묶어서 하나의 Observable에 연결을 시켰다.

3. Schedulers

Schedulers는 함수를 실행하는 Thread를 결정해주는 역할을 한다. 보통 UI를 변화시키는 함수는 Main Thread에서 실행이 되고 API를 통해 데이터를 가져오거나 연산 등을 하는 함수는 Background에서 실행을 시킨다. 동일한 기능으로 swift 내장되어 있는 Dispath queue가 존재하는데 훨씬 더 강력하고 쉽다. RxSwift에는 여러가지의 스케줄러가 이미 정의되어 있어서 개발자가 따로 커스텀해서 스케줄러를 생성할 일은 없다.


3. RxSwift 설치

  • 터미널 실행
cd "프로젝트 경로"
pod init
nano podfile
  • RxSwift 
# Uncomment the next line to define a global platform for your project
# platform :ios, '11.0'

target '프로젝트' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!
  # Pods for TakeOff
pod 'RxSwift', '~> 5.0.0'
pod 'RxCocoa' #미리 설치해놓으면 좋음
  target '프로젝트 Test' do
    inherit! :search_paths
    # Pods for testing
  end
  • cocoaPods 실행 및 workspace 실행
pod install
open 프로젝트.xcworkspace
반응형

'RxSwift' 카테고리의 다른 글

6. RxSwift Relay, Signal, Driver  (0) 2021.10.07
5. RxSwift Subject  (0) 2021.10.03
4. RxSwift Operator(2)  (0) 2021.09.30
3. RxSwift Oporator(1)  (0) 2021.09.07
2. RxSwift Observable이란?  (0) 2021.09.02