RxSwift를 21일간 공부하는 루틴
"Rx를 기깔나게 쓰는 신입개발자 도전" 시작 🚀
RxSwift 를 접하기 전에, api network 는 Alamofire 라이브러리를 주로 사용하였다.
Alamofire는 swift기반의 http 프로토콜을 사용하는 통신라이브러리이다.
Alamofire를 사용한 이유는 responseJSON
을 통해 데이터와 오류처리를 URLSession 보다 간단하게 사용할 수 있었기 때문이다.
Rx에도 alamofire가 오픈소스로 공개되어있다.
그래서 RxAlamofire를 사용해보려고 하였다.
그전에 Rx+URLSession을 먼저 살펴보고 RxAlamofire를 공부해보려고 한다.
왜나하면 Alamofire도 결국 URLSession에 기반을 두고 있기 때문이다.
사용한 open API 는 영화관입장권통합전산망이 제공하는 오픈API서비스이다. kobisOpenAPI 에서 자세한 api 명세를 확인할 수 있다
rx가 제공하는 extension중 data 함수이다.
코드를 보면, URLRequest를 받아 코드를 확인후, Observable로 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 타입을 사용하여 성공시에는 직접 구현한 객체를 , 실패시는 에러를 리턴하도록 작성하였다.
다음과 같이 영화제목이 잘 받아와진것을 확인 할 수 있다.
다음에는 이 데이터를 테이블뷰와 바인딩 해보겠다.