IOS

[IOS] RxSwfit 사용하기

Xmobile 2021. 1. 4. 14:57

https://github.com/ReactiveX/RxSwift

 

ReactiveX/RxSwift

Reactive Programming in Swift. Contribute to ReactiveX/RxSwift development by creating an account on GitHub.

github.com

 

RxSwift는 Swfit로 작성된 반응형 익스텐션 버전입니다.

Observable을 만들어 스트림에서 값 및 기타 이벤트를 구독하여 로직을 분리시킬 수 있고

비동기 및 함수적 스타일 연산자를 사용하여 를 사용하여 데이터를 참조하는 방법을 제공합니다.

 

1. pod 설정

pod 'RxSwift', '6.0.0-rc.2'
pod 'RxCocoa', '6.0.0-rc.2'

 

2. Observable 만들기 

static func fetchLotto(_ order: Int) -> Observable<Lotto?> {
        return Observable.create() { emitter in
            let url = URL(string: domainUrlString + "?order=" + String(order))!
            let task = session.dataTask(with: url, completionHandler: { (data: Data?, response: URLResponse?, err: Error?) -> Void in
                guard err == nil else {
                    emitter.onError(err!)
                    return
                }
                
                let lottoDto = try? JSONDecoder().decode(Lotto.self, from: data!)
                emitter.onNext(lottoDto)
            })
            
            task.resume()
            
            return Disposables.create(){
                task.cancel()
            }
        }
    }

 

3. subscribe 사용하기 

let observable = APIService.fetchLotto(order)
        _ = observable
            .observe(on: MainScheduler.instance)
            .subscribe(onNext: {
                self.lotto = $0
                self.viewUpdate()
            })
            .disposed(by: disposeBag)

 

옵저버블은 3가지 이벤트를 방출합니다.

public enum Event<Element> {
  case next(Element) //정상
  case error(Swfit.Error) //에러
  case completed //완료 
}

 

4. 마무리

위와 같이 행위를 Api를 Observable을 만들고 사용하는 쪽에서 Observable을 return받아 사용할 수 있습니다.

이와 같은 장점은 디자인 아키텍쳐 측면에서 비즈니스 로직을 분리하고 테스트를 별도로 할 수 있고

비동기 행위들을 Observable을 만들어 사용하는 쪽에서 일과된 코드를 유지할 수 있으며 

MVVM구조와 같은 구조에서 화면에서는 ViewModel 데이터에만 집중할 수 있는 장점으로 활용할 수 있습니다.