ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [뉴스어플 정리] 2. 뉴스데이터 가져오기
    iOS/뉴스어플(RxSwift) 2021. 5. 24. 20:28
    import Foundation
    import RxSwift
    
    final class APICaller {
        
        static let shared = APICaller()
        
        struct Source {
            static let kr = URL(string: "한국API")
            static let us = URL(string: "미국API")
        }

    APICaller라는 클래스를 만들었다. 싱글톤 패턴을 사용하기위해 static으로 shared라는 클래스 인스턴스를 만들었다.

    Source라는 구조체를 만들어 한국API, 미국API을 URL형으로 저장했다.

     

    첫시작은 미국뉴스로 시작하고 버튼하나를 누르면 한국뉴스로 바꾸려고해서 주소를 저장해놨다.

     

     

    // 1.
    static func getNewsData(source: URL?) -> Observable<[Article]> {
            // 2.
            return Observable.create() { emitter in
                // 3.
                guard let url = source else {
                    return Disposables.create()
                }
                // 4.
                URLSession.shared.dataTask(with: url) { data, _, error in
                    // 5.
                    if let error = error {
                        emitter.onError(error)
                    }
                    else if let data = data {
                        do {
                            // 6.
                            let result = try JSONDecoder().decode(APIResponse.self, from: data)
                            // 7.
                            emitter.onNext(result.articles)
                            emitter.onCompleted()
                        } catch {
                            emitter.onError(error)
                        }
                    }
                }.resume()
                return Disposables.create()
            }
        }
    }

    1. getNewsData라는 함수를 만들었다. URL형의 source를 인자로 받는다.

    2. 이 함수는 Observable<[Article]>을 반환한다. Observable.create()로 Observable을 만들어 return한다.

    3. 옵셔널 바인딩으로 source에서 api 주소인 url을 얻는다. 실패하면 Disposables.create()를 리턴해서 Observable 만들기를 끝낸다.

    4. URLSession을 이용해 url로 부터 data를 얻는다.

    5. data를 가져오는 과정에서 error가 생기면 emitter에 onError로 에러를 넘긴다.

    6. data 가져오면 JSONDecoder를 이용해서 만들어 놓은 APIResponse 모델에 맞게 decode 한다.

    7. decode된 데이터에서 onNext에 articles를 넘긴다.

    8. decode 과정에서 error가 나오면 emitter에 onError로 에러를 넘긴다.

     

    이렇게 되면 이 함수를 호출하면 Observable<[Article]>을 생성하고

    이걸 subscribe해서 onNext로 넘긴 articles를 가져올 수 있다.

    이 articles는 API에서 가져온 뉴스데이터를 JSONDecoder로 decode한 [article]이다.

     

Designed by Tistory.