SeSAC OOD 11/21


今日はどこから何を始めるか考えているうちに、まずサーバー通信をテストすることにしました.しかし、サーバー通信もどこから始めるのか...Alamofireだけ使うのかな…そしてこのプロジェクトのそのプロジェクトのコードを見て、Moyaが気持ちよさそうに見えました.コードだけで何を意味しているのかわかるし、後でサーバーのOODも加えてメンテナンスしやすくなるので、Moyaを使うことにしました

Moya Github

  • ライブラリハブのホームページ
    https://github.com/Moya/Moya
  • ライブラリの使用方法
    https://github.com/Moya/Moya/blob/master/docs/Examples/Basic.md
  • Moya


    MoyaはAlamofieを直接呼び出してネットワーク抽象層をカプセル化するライブラリである.だから実際にはサーバー通信を行う役割ではなく、きれいに整理されていますか?ライブラリとして理解されました...そうですか.
    そこでAlamofire氏は、URLセッションを抽象化すると、Moyaは抽象URLやパラメータなどを抽象化すると述べた.
  • URLSSession->iOSが提供するHTTPでAPIを提供し、データの送受信を支援
  • 1.すべてのAPIを列挙に設定

  • 優先APIService.swiftという名前のファイルを作成し、使用するすべてのAPIをenumに設定します.各APIに必要なパラメータ(トークン、クエリー、パス、ボディ)は、各エンクロージャのパラメータとして定義することもできます.
  • enum APITarget { // 토큰 쿼리 패스 바디 모두 입력
        case signup(email: String, password: String, nickname: String, exCycle: Int)
        case signin(email: String, password: String)
        case certiContentUpload(token: String, exTime: String, exIntensity: String, exEvalu: String, exComment: String, certiSport: String)
        case certiImageUpload(token: String, image: UIImage, certiId: Int)
        case certiByCal(token: String, date: String)
        case certiDetail(token: String, certiId: Int)
        case certiUpdate(token: String, exTime: String, exIntensity: String, exEvalu: String, exComment: String, certiSport: String, certiId: Int)
        case certiDelete(token: String, certiId: Int)
        case mypageAllCerti(token: String)
        case mypageInfo(token: String)
        case settingExCycle(token: String, exCycle: Int)
    }

    2.enumを採用したTargetType

  • 作成されたばかりのAPI enumは、Moyaのターゲットタイププロトコル
  • を使用する必要があります.
    extension APITarget: TargetType {
        var baseURL: URL {
            return URL(string: "http://[baeURL]")!
        }
        var path: String { // path에 들어갈 파라미터 넣어주기
            switch self {
            case .signup:
                return "/user/signup"
            case .signin:
                return "/user/signin"
            case .certiContentUpload:
                return "/certi"
            case .certiImageUpload(_, _, let certiId):
                return "/certi/image/\(certiId)"
            case .certiByCal:
                return "/certi"
            case .certiDetail(_, let certiId):
                return "/certi/detail/\(certiId)"
            case .certiUpdate:
                return "/certi"
            case .certiDelete(_, let certiId):
                return "/certi/\(certiId)"
            case .mypageAllCerti:
                return "/mypage"
            case .mypageInfo:
                return "/mypage/info"
            case .settingExCycle:
                return "/mypage/cycle"
            }
        }
        var method: Moya.Method { // 각 CRUD
            switch self {
            case .signup, .signin, .certiContentUpload, .certiImageUpload:
                return .post
            case .certiByCal, .certiDetail, .mypageAllCerti, .mypageInfo:
                return .get
            case .certiUpdate, .settingExCycle:
                return .put
            case .certiDelete:
                return .delete
            }
        }
        var sampleData: Data {
            return Data()
        }
        var task: Task { // 바디는 JSONEncoding.default, 쿼리가 들어가면 URLEncoding.queryString, 이미지는 .uploadMultipart
            switch self {
            case .certiDetail, .mypageAllCerti, .mypageInfo, .certiDelete:
                return .requestPlain
            case .certiByCal(_, let date): // 쿼리
                return .requestParameters(parameters: ["date": date], encoding: URLEncoding.queryString)
            case .signup(let email, let password, let nickname, let exCycle):
                return .requestParameters(parameters: ["email": email, "password": password, "nickname": nickname, "ex_cycle": exCycle], encoding: JSONEncoding.default)
            case .signin(let email, let password):
                return .requestParameters(parameters: ["email": email, "password": password], encoding: JSONEncoding.default)
            case .certiContentUpload(_, let exTime, let exIntensity, let exEvalu, let exComment, let certiSport):
                return .requestParameters(parameters: ["ex_time": exTime, "ex_intensity": exIntensity, "ex_evalu": exEvalu, "ex_comment": exComment, "certi_sport": certiSport], encoding: JSONEncoding.default)
            case .certiImageUpload(_, let image, _):
                let imageData = MultipartFormData(provider: .data(image.jpegData(compressionQuality: 1.0)!), name: "image", fileName: "jpeg", mimeType: "image/jpeg")
                return .uploadMultipart([imageData])
            case .certiUpdate(_, let exTime, let exIntensity, let exEvalu, let exComment, let certiSport, _):
                return .requestParameters(parameters: ["ex_time": exTime, "ex_intensity": exIntensity, "ex_evalu": exEvalu, "ex_comment": exComment, "certi_sport": certiSport], encoding: JSONEncoding.default)
            case .settingExCycle(_, let exCycle):
                return .requestParameters(parameters: ["ex_cycle": exCycle], encoding: JSONEncoding.default)
            }
        }
        var headers: [String : String]? {
            switch self {
            case .signup, .signin:
                return ["Content-Type": "application/json"]
            case .certiImageUpload(let token, _, _):
                return ["Content-Type": "multipart/form-data", "token": token]
            case .certiContentUpload(let token, _,_,_,_,_), .certiByCal(let token, _), .certiDetail(let token, _), .certiUpdate(let token, _,_,_,_,_,_), .certiDelete(let token, _), .mypageAllCerti(let token), .mypageInfo(let token), .settingExCycle(let token, _):
                return ["Content-Type" : "application/json", "token" : token]
            }
        }
    baseURL:サーバアドレス
    path:各APIパスを保存(パス変数を指定)
    方法:各API CRUDタイプを設定する
    task:各APIに必要なパラメータを設定する
    ->マスターリクエストを同時に送信する必要がある場合は、エンコーディング:JSONNcode.default
    ->クエリーが必要な場合はエンコーディング:URLエンコーディング.queryString
    ->画像を返します.uploadMultipart([MultipartFormData])
    何もいらなければ、引き返す.requestPlain
    SampleData:テスト用データ
    ヘッダー:各APIヘッダー(Content-Typeとタグ)を指定します.

    3.Moya providerの使用


    この部分は月曜日ではなく月曜日に埋め尽くす^0^,,,

    +今日作った




    -フォルダのクリーンアップ+plistの光源モード固定&font設定+color asset追加+launchscreen+moya学習