안녕하세요. Skillist입니다
코로나 검사소 프로젝트에 대한 포스팅을 빨리 끝내고 RxSwift 개발 하고싶어요!!!!!!
———————————————————————————————————————————————————
먼저 공공데이터 API를 사용한다고 말씀드렸죠?
https://www.data.go.kr/iim/api/selectAPIAcountView.do
가입하고, api 사용 신청하세요~
———————————————————————————————————————————————————
api response에 대한 decodable입니다.
딱히 설명하지 않겠습니다.
제가 포스팅한 codable 생성 툴 사용해보세요 진짜 편해요. 중간중간 오류나는 경우가 있는데 이땐 좀... 그럴땐 웹툴로 이용해보세요.
https://skillist.tistory.com/266?category=471174
———————————————————————————————————————————————————
이번은 기본 url component입니다.
23라인 : 코로나 센터의 max count가 300을 넘지 않아, 한페이지에 모든 코로나 센터를 받을 수 있도록 쿼리파람을 설정했어요.
———————————————————————————————————————————————————
이번은 네트워크 통신 메소드 입니다.
20라인 : urlComponent를 받아오죠
27라인 : 공공데이터 api의 키를 설정합니다.
29라인 : 통신을 통해, 받아온 결과를 리턴하는 single을 리턴합니다. single은 성공 혹은 실패만 반환해주죠.
32라인 : 데이터를 디코딩 해보고, 성공 시 데이터를 리턴합니다.
35, 39라인 : 실패시 실패를 리턴합니다.
41라인 : 옵저버블을 single로 변환해줍니다.
———————————————————————————————————————————————————
그리고 호출하면, 네트워크 통신에 대한 결과를 받아볼 수 있습니다.
———————————————————————————————————————————————————
역시 글로 설명을 잘 못하겠네요.
설명 잘 못하면 모다? 잘 모르는것이다.
코드만 봐주세요 열심히 공부하겠습니다.
잘못되거나 부족한 내용 등, 피드백 감사합니다!
https://github.com/DeveloperSkillist/CoronaCenterRxSwift
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 전체 코드 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
import Foundation
import CoreLocation
struct CenterAPIResponse: Decodable {
let data: [Center]
}
struct Center: Hashable, Decodable {
let id: Int
let sido: Sido
let facilityName: String
let address: String
let lat: String
let lng: String
let centerType: CenterType
let phoneNumber: String
enum CenterType: String, Decodable {
case central = "중앙/권역"
case local = "지역"
}
enum Sido: String, Decodable, CaseIterable, Identifiable {
case 서울특별시
case 부산광역시
case 대구광역시
case 인천광역시
case 광주광역시
case 대전광역시
case 울산광역시
case 세종특별자치시
case 경기도
case 강원도
case 충청북도
case 충청남도
case 전라북도
case 전라남도
case 경상북도
case 경상남도
case 제주특별자치도
var id: String {
return self.rawValue
}
}
var coordinate: CLLocationCoordinate2D {
return CLLocationCoordinate2D(
latitude: CLLocationDegrees(self.lat) ?? .zero,
longitude: CLLocationDegrees(self.lng) ?? .zero
)
}
}
import Foundation
struct CenterAPI {
static let scheme = "https"
static let host = "api.odcloud.kr"
static let path = "/api/15077586/v1/centers"
func getCenterListComponents() -> URLComponents {
var components = URLComponents()
components.scheme = CenterAPI.scheme
components.host = CenterAPI.host
components.path = CenterAPI.path
components.queryItems = [
URLQueryItem(name: "perPage", value: "300")
]
return components
}
}
import RxSwift
import Foundation
class CenterNetwork {
private let session: URLSession
let api = CenterAPI()
init(session: URLSession = .shared) {
self.session = session
}
func getCenters() -> Single<Result<CenterAPIResponse, URLError>> {
guard let url = api.getCenterListComponents().url else {
return .just(.failure(URLError(.badURL)))
}
let request = NSMutableURLRequest(url: url)
request.httpMethod = "GET"
//"APIKey.key"에 본인의 api key를 입력하세요.
request.setValue("Infuser \(APIKey.key)", forHTTPHeaderField: "Authorization")
return session.rx.data(request: request as URLRequest)
.map { data in
do {
let centerAPIResponse = try JSONDecoder().decode(CenterAPIResponse.self, from: data)
return .success(centerAPIResponse)
} catch {
return .failure(URLError(.cannotParseResponse))
}
}
.catch { _ in
.just(.failure(URLError(.cannotLoadFromNetwork)))
}
.asSingle()
}
}
'iOS 개발 > 코로나검사소 앱(RxSwift)' 카테고리의 다른 글
코로나 검사소 - 5. SceneDelegate (0) | 2022.01.22 |
---|---|
코로나 검사소 - 4. MapView (0) | 2022.01.22 |
코로나 검사소 - 3. 코로나 센터 선택 화면 (0) | 2022.01.21 |
코로나 검사소 - 1. 지역 선택 화면 구현하기 (0) | 2022.01.21 |
코로나 검사소 - 0. 프리뷰 (0) | 2022.01.21 |