RxSwift Operator에 대해서 알아보자 3탄 !!

2020. 5. 31. 09:50iOS/RxSwift

지금까지 RxSwift의 기본적인 사용방법에대해 알아봤습니다. 그러나 RxSwift에서 데이터를 하나 보내는데 많은 과정이 필요합니다.

단순히 Hello World 라는 텍스트를 보내는데만 해도 다음과 같은 과정이 필요합니다.

    func downloadJson(_ url: String) -> Observable<String?>{

        return Observable.create { emitter in
            emitter.onNext("Hello World")
            emitter.onCompleted()
            return Disposables.create()
        }
    }

이러한 과정을 줄이기 위해 하나의 간단한 데이터들을 보낼때 just 라는 메소드를 사용합니다.

사용 방법은 아주 간단합니다.

    
    func downloadJson(_ url: String) -> Observable<String?>{
    
        return Observable.just("Hello World")
        
    }

원하는 데이터를 just안에 담아 리턴하면 됩니다.

또한 from이라는 메소드를 통해 배열도 보낼 수 있습니다.

    
    func downloadJson(_ url: String) -> Observable<String?>{ 
    
    	return Observable.from(["Hello", "World"])
        
    }

이렇게 간단하게 사용할 수 있는 함수들을 Sugar API 라고 합니다.

데이터를 받을때도 마찬가지로 쉽게 사용할 수 있는 방법이 있습니다.

        
    // 2. Observable로 오는 데이터를 받아서 처리하는 방법
    @IBAction func onLoad() {
        self.editView.text = ""
        setVisibleWithAnimation(activityIndicator, true)
        
        let _ = downloadJson(MEMBER_LIST_URL)
            .subscribe { event in
                switch event {
                case .next(let data):
                    DispatchQueue.main.async {
                        self.editView.text = data
                        self.setVisibleWithAnimation(self.activityIndicator, false)
                    }
                case .completed:
                    break
                case .error(_):
                    break
                }
        }

    }

기존의 이벤트의 분기처리를 통해 각 행동을 지정해 두었습니다. 그러나 단순한 행동이라면 다음과 같이 간단하게 처리할 수도 있습니다.

    // 2. Observable로 오는 데이터를 받아서 처리하는 방법
    @IBAction func onLoad() {
        self.editView.text = ""
        setVisibleWithAnimation(activityIndicator, true)
        
        _ = downloadJson(MEMBER_LIST_URL)
            .subscribe(onNext:{print($0)},
                       onError: { err in print(err)},
                       onCompleted: { print("Completed")})
                       
        _ = downloadJson(MEMBER_LIST_URL)
            .subscribe(onNext:{print($0)})
        
    }

이렇게 필요한 상태에따라 변형하여 사용할 수도 있습니다.

    // 2. Observable로 오는 데이터를 받아서 처리하는 방법
    @IBAction func onLoad() {
        self.editView.text = ""
        setVisibleWithAnimation(activityIndicator, true)
        
        _ = downloadJson(MEMBER_LIST_URL)
            .subscribe(onNext:{ json in
                DispatchQueue.main.async {
                    self.editView.text = json
                    self.setVisibleWithAnimation(self.activityIndicator, false)
                }
            })
    }

또한 다른 쓰레드에서 UI를 바꿔주기 위해 메인쓰레드를 호출을 해주었는데

이러한 과정도 observeOn이라는 함수를 통해 메인스레드를 간단히 호출해서 변경할 수 있도록 합니다.

       
    // 2. Observable로 오는 데이터를 받아서 처리하는 방법
    @IBAction func onLoad() {
        self.editView.text = ""
        setVisibleWithAnimation(activityIndicator, true)
        
        _ = downloadJson(MEMBER_LIST_URL)
            .observeOn(MainScheduler.instance)
            .subscribe(onNext:{ json in
                self.editView.text = json
                self.setVisibleWithAnimation(self.activityIndicator, false)
            })
    }

just, from 함수는 데이터의 생성을 위해, subscribe안에서 는 데이터의 처리를 위해 Sugar API를 사용하였습니다.

그리고 데이터를 Observable로 받아와서 subscribe를 하는 중간에 데이터의 변형을 위해 사용하는 observeOn과 같은 api들을 operator라고 합니다.

operator에는 map과 filter도 있습니다. 고차함수로 매우 익숙한 함수인데 비슷하게 사용할 수 있습니다.

    // 2. Observable로 오는 데이터를 받아서 처리하는 방법
    @IBAction func onLoad() {
        self.editView.text = ""
        setVisibleWithAnimation(activityIndicator, true)
        
        _ = downloadJson(MEMBER_LIST_URL)
            .map{json in json?.count ?? 0}	// map을 통해 데이터의 count값으로 변경
            .filter{cnt in cnt > 0 }		// filter를 통해 데이터를 정제
            .map{ "\($0)"}					// map을 통해 String 타입으로 변경
            .observeOn(MainScheduler.instance)
            .subscribe(onNext:{ json in
                self.editView.text = json
                self.setVisibleWithAnimation(self.activityIndicator, false)
            })
    }

이 operator의 종류는 굉장히 아주아주 많습니다. 이 종류는 다음의 문서에서 확인할 수 있습니다.

이 문서에서 상세하게 볼 수 있습니다. (ex.just, from, observeOn)