boraBong

[iOS] [MVVM+RxSwift] 📌 1. RxSwift를 사용한 비동기 프로그래밍 - 3) RxSwift 정복 본문

iOS

[iOS] [MVVM+RxSwift] 📌 1. RxSwift를 사용한 비동기 프로그래밍 - 3) RxSwift 정복

보라봉_ 2022. 2. 16. 17:50
728x90

3) 🔥 RxSwift 정복

1️⃣ 비동기로 생기는 데이터를 Observable로 감싸서 리턴하는 방법

2️⃣ Observable로 오는 데이터를 받아서 처리하는 방법

 

👍🏻 위 두가지만 잘 익혀두면 RxSwift를 정복한다고 합니다 :) :) 🙋🏻‍♀️🙋🏻‍♀️


1️⃣ 비동기로 생기는 데이터를 Observable로 감싸서 리턴하는 방법

// 1. 비동기로 생기는 데이터를 Observable로 감싸서 리턴하는 방법
        return Observable.create() { emitter in
            emitter.onNext("hello")
            emitter.onNext("world")
            emitter.onCompleted()
            
            return Disposables.create()
        }
  • 일단 Observable.create()를 해서 하나 만듭니다.
  • 인자로는 클로저가 하나 들어갑니다. ex) emitter.
  • 이때, 데이터를 전달하려면 onNext를 사용하여 전달해줍니다. (데이터는 여러개 전달할 수도 있습니다!)
  • 여기서 데이터 전달이 끝났다는 의미에서  onCompleted를 호출하면 Observable이 만들어지게 됩니다.
  • 이렇게 만든 Observable을 리턴합시다!!!
    • 💡그런데, 이 Observable형태는 반드시 dispose를 반환해야 하기에 return Disposables.create()를 해주어 dispose를 반환시켜줍니다.

 

📌 [제대로 만들어진 Observable]

func downloadJson(_ url: String) -> Observable<String?> {
        // 1. 비동기로 생기는 데이터를 Observable로 감싸서 리턴하는 방법
        return Observable.create() { emitter in
            let url = URL(string: url)!
            let task = URLSession.shared.dataTask(with: url) { (data, _, err) in
                guard err == nil else {
                    emitter.onError(err!)
                    return
                }
                
                if let dat = data, let json = String(data: dat, encoding: .utf8) {
                    emitter.onNext(json)
                }
                
                emitter.onCompleted()
            }
            
            task.resume()
            
            return Disposables.create() {
                task.cancel()
            }
        }
    }

 

2️⃣ Observable로 오는 데이터를 받아서 처리하는 방법

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

 


💡 곰튀김님의 'MVVM+RxSwift 4시간만에 끝내기' 강의를 보고 정리한 자료입니다.
https://www.youtube.com/watch?v=iHKBNYMWd5I

반응형
Comments