본문 바로가기
iOS/RxSwift

RxSwift를 사용한 비동기 프로그래밍 #2

by HaningYa 2020. 5. 28.
728x90

 

 

 

iamchiwon/RxSwift_In_4_Hours

RxSwift, 4시간 안에 빠르게 익혀 실무에 사용하기. Contribute to iamchiwon/RxSwift_In_4_Hours development by creating an account on GitHub.

github.com


[2교시] RxSwift 활용하기 - 쓰레드의 활용과 메모리 관리

Stream의 분리 및 병합

[merge]

 

ReactiveX - Merge operator

RxScala implements this operator as flatten, flattenDelayError, merge, and mergeDelayError. merge takes a second Observable as a parameter and merges that Observable with the one the merge operator is applied to in order to create a new output Observable.

reactivex.io

  • 단순하게 하나로 합친다.
  • 두개의 observable 의 데이터 타입이 같아야 한다.

[zip]

 

ReactiveX - Zip operator

RxJS implements this operator as zip and zipArray. zip accepts a variable number of Observables or Promises as parameters, followed by a function that accepts one item emitted by each of those Observables or resolved by those Promises as input and produces

reactivex.io

  • 위의 데이터와 아래의 데이터를 하나의 쌍으로 만들어서 전달한다.
  • 쌍이 되지 않으면 내려오지 않는다. (항상 두개의 데이터 쌍을 이뤄야함)
  • 어떻게 쌍을 만들것이냐는 사용자가 결정한다.
  • 데이터 타입이 달라도 된다.

[예시]

@IBAction func onLoad() {
        editView.text = ""
        self.setVisibleWithAnimation(self.activityIndicator, true)
        
        let jsonObservable = downloadJson(MEMBER_LIST_URL)
        let helloObservable = Observable.just("Hello World")
        
        _ = Observable.zip(jsonObservable,helloObservable){$1 + "\n" + $0!}
            .observeOn(MainScheduler.instance) // 메인쓰레드로 바뀌고
            .subscribe ( onNext: {json  in
                self.editView.text = json
                self.setVisibleWithAnimation(self.activityIndicator, false)
        })
    }

Hello World 와 json string 을 쌍으로 만든다.

Hello World 뒤에 json 이 온다.


 

[combineLatest]

 

ReactiveX - CombineLatest operator

RxJS implements this operator as combineLatest. It may take a variable number of individual Observables (as well as the combining function) as parameters, or a single Array of Observables (as well as the combining function). Sample Code /* Have staggering

reactivex.io

  • zip 은 쌍이 없으면 못 내려오지만 combineLatest 는 쌍이 없으면 가장 최근 데이터와 쌍을 이룬다.

RxSwift 기본 복습

  • 비동기로 생성되는 데이터를 처리하기 위해서 completion 를 만들어서 전달했다
  • return 으로 만들어서 전달하고 싶어서 나중에 생기는 데이터 class 를 만들었다
  • 그런걸 제공하주는 유틸리티중 하나가 RxSwift 이다
  • RxSwift에서 나중에 생기는 데이터 class 는 Observable 이다
  • Observable의 데이터를 꺼내 쓰려면 subscribe 하면된다.
  • Observable 을 만드는 방법은 create 를 호출해서 emitter 에 next 로 데이터를 넘기거나 error 처리하거나 complete 하면 된다.
  • 동작을 취소하려면 Disposables.create {코드} 로 처리한다.
  • Subscribe에 이벤트를 달아서 처리하면 된다.
  • 기본 방법 외에 Suger api 를 제공해 준다.
  • Suger를 특별히 operator 라고 부른다.
  • 생성에 관련된 just, from operator가 있다.
  • 데이터 전달 과정에 데이터를 조작하거나 쓰레드를 바꾸는 데도 operator 를 쓸 수 있다.
  • subscribe 할 때도 event 를 받지 말고 처리하고 싶은 event 만 받아서 처리할 수 있다
  • subscribe 하면 리턴값으로 Disposable 이 반환되는데 취소하고싶을 때 호출 해 주면 된다.

Disposable을 Dispose 하는 방법

var disposable : Disposable?

disposable = Observable.zip(jsonObservable,helloObservable){$1 + "\n" + $0!}
            .observeOn(MainScheduler.instance) // 메인쓰레드로 바뀌고
            .subscribe ( onNext: {json  in
                self.editView.text = json
                self.setVisibleWithAnimation(self.activityIndicator, false)
        })
        
 //취소하고 싶을때 - viewWillDisappear 같은
 disposable.dispose()
 
 /*------------------------------------------------*/
 
 //화면에 여러개의 취소시켜야 하는 작업이 있을 경우
 var disposable : [Disposable] = []
 let d = Observable.zip(jsonObservable,helloObservable){$1 + "\n" + $0!}
            .observeOn(MainScheduler.instance) // 메인쓰레드로 바뀌고
            .subscribe ( onNext: {json  in
                self.editView.text = json
                self.setVisibleWithAnimation(self.activityIndicator, false)
        })
 disposable.append(d)
 
 //취소하고 싶을때 - viewWillDisappear 같은
 disposable.forEach{$0.dispose()}
 

 

Disposable suger api

  • DisposeBag()
var disposable = DisposeBag()

let d = Observable.zip(jsonObservable,helloObservable){$1 + "\n" + $0!}
            .observeOn(MainScheduler.instance) // 메인쓰레드로 바뀌고
            .subscribe ( onNext: {json  in
                self.editView.text = json
                self.setVisibleWithAnimation(self.activityIndicator, false)
        })
        
 //취소하고 싶을때 - viewWillDisappear 같은
 disposable.insert(d)

더 귀찮을 때

var disposeBag = DisposeBag()

Observable.zip(jsonObservable,helloObservable){$1 + "\n" + $0!}
            .observeOn(MainScheduler.instance) // 메인쓰레드로 바뀌고
            .subscribe ( onNext: {json  in
                self.editView.text = json
                self.setVisibleWithAnimation(self.activityIndicator, false)
        })
        .disposed(by: disposeBag)
        

RxCocoa

RxSwift의 기능을 UIKit 에 extention 으로 추가한 것이다.

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'RxSwift+MVVM' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for RxSwift+MVVM
  pod 'RxSwift'
  pod 'RxCocoa'
  pod 'RxViewController'

end

 

728x90

댓글