[RxSwift] 13. RxSwift + URLSession

miori·2022년 2월 27일
1

RxSwiftBasic

목록 보기
25/29

RxSwift를 21일간 공부하는 루틴
"Rx를 기깔나게 쓰는 신입개발자 도전" 시작 🚀

RxSwift 를 접하기 전에, api network 는 Alamofire 라이브러리를 주로 사용하였다.
Alamofire는 swift기반의 http 프로토콜을 사용하는 통신라이브러리이다.
Alamofire를 사용한 이유는 responseJSON을 통해 데이터와 오류처리를 URLSession 보다 간단하게 사용할 수 있었기 때문이다.

Rx에도 alamofire가 오픈소스로 공개되어있다.
그래서 RxAlamofire를 사용해보려고 하였다.
그전에 Rx+URLSession을 먼저 살펴보고 RxAlamofire를 공부해보려고 한다.
왜나하면 Alamofire도 결국 URLSession에 기반을 두고 있기 때문이다.

Rx로 Networking

사용한 open API 는 영화관입장권통합전산망이 제공하는 오픈API서비스이다. kobisOpenAPI 에서 자세한 api 명세를 확인할 수 있다

URLSession + Rx

rx가 제공하는 extension중 data 함수이다.
정의

코드를 보면, URLRequest를 받아 코드를 확인후, Observable로 data로 방출해준다.

코드 : session.rx.data,디코딩

   func getBoxOffice() -> Single<Result<BoxOfficeResponse,URLError>> {

        guard let url = api.getBoxOffice().url else {
            return .just(.failure(URLError(.badURL)))
        }
        
        let request = NSMutableURLRequest(url: url)
        request.httpMethod = "GET"
        
        return session.rx.data(request: request as URLRequest)
            .map { data in
                // json decoding
                do {
                    let boxOfficeData = try JSONDecoder().decode(BoxOfficeResponse.self, from: data)
                    return .success(boxOfficeData)
                } catch {
                    return
                        .failure(URLError(.cannotParseResponse))
                }
            }
            .catch { _ in
            .just(Result.failure(URLError(.cannotLoadFromNetwork)))
            }
            .asSingle()
    }

  • BoxOfficeResponse : api 통신 json 결과를 토대로 구현한 struct
  • api.getBoxOffice() : scheme, host, path 와 queryItems를 받아 URLComponents를 반환하는 함수

통신후, 성공적으로 데이터를 받아왔을 때 디코딩을 하는 함수다.
네트워크는 결과값으로 성공과 실패를 가지기 때문에 single을 사용하였다.
그리고 Result 타입을 사용하여 성공시에는 직접 구현한 객체를 , 실패시는 에러를 리턴하도록 작성하였다.

결과

다음과 같이 영화제목이 잘 받아와진것을 확인 할 수 있다.

아웃풋


다음에는 이 데이터를 테이블뷰와 바인딩 해보겠다.

profile
iS를 공부하는 miori 입니다.

0개의 댓글