Skip to content

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]
    }
}

ViewController

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)
                
            }
            
        }
}