-
Notifications
You must be signed in to change notification settings - Fork 3
Mascota Moya 사용법
jeongyeob97 edited this page Jul 13, 2021
·
1 revision
APIServices.swift (baseURL을 여기에 저장해서 나중에 서버 base URL이 바껴도 이 변수만 바꿀 수 있도록 처리)
struct APIServices {
static let baseURL= "https://~~~~~~"
}
하나의 파트로 APIServices 구현하고 내부에 연관된 API 구현 (Home, Calendar, Account)
import Foundation
import Moya
// ~~API로 네이밍
// 모야는 enum을 이용해서 쉽게 구현하기 때문에 어떤 기능을 할지 enum의 case로 구현
enum HomeAPI {
// Servie Http Method + 서버 api (이름 최대한 간략하게)
case getIndexPerDiaries
// 패러미터로 받을 값이 있으면 옆에 받을 변수 설정
case postIndex(id: Int)
}
// Moya Target는 TargetType를 준수해야 한다
// 아래에 있는 것들이 TargetType를 위해 필요한 정보
extension MyTownAPI: TargetType {
// baesURL, APIServices.baseURL을 정의해줬기 때문에 바로 접근해서 URL
var baseURL: URL {
guard let url = APIServices.baseURL else {
fatalError()
}
return url
}
// baseURL + path 서버 request 경로
var path: String {
switch self {
case .getIndexPerDiaries:
return
case .postIndex
}
}
// Moya.Method -> http Method (get,post,put,patch,delete)
var method: Moya.Method {
switch self {
case .getIndexPerDiaries:
return .get
case .postIndex
return .post
}
}
// sampleData라서 별로 처리해줄 필요 없음
var sampleData: Data {
return Data()
}
// Task는 어떤 방식으로 서버 통신을 할 것인지
var task: Task {
switch self {
case .getIndexPerDiaries:
return .requestPlain
case .postIndex(id: Int)
// 패러미터 사용할 때
// 다른 방식을 사용하면 모야 공문 가서 확인하면 됨
return .requestParemeters(parameters: ["id": id], encoding: JSONEcoding.default)
}
}
var headers: [String : String]? {
// header에 추가해야 될 정보가 있다면 case 분리해서 header값 넣어주면 됨
// 근데 이번엔 header 없음 ㅋㅋ
guard let token = UserDefaults.standard.value(forKey: "token") as? String else {
print("no token")
return nil
}
return ["Authorization": token]
}
}
import Moya // 꼭 임포트!!
class ViewController: UIViewController {
let service = MoyaProvider<HomeAPI>() //<Target명 >
}
private func 통신() {
// 타깃에 있는 case에 접근
// request 하면 @escaping closure로 통신 후 response나 비동기 처리 가능
service.request(ProductsAPI.getProductsDetail(productNo: self.productId)) { [weak self] result in
guard let self = self else {
return
}
switch result{
case .success(let response):
do {
// Codable 객체로 decode
let data = try JSONDecoder().decode(Model.self, from: response.data)
} catch(let err) {
print(err.localizedDescription)
}
// 통신 자체가 안될 때
case .failure(let error):
print(error.localizedDescription)
}
}
}