タクマ松下のブログ

情報科学科の学生が書く記録。フロントエンドとサーバサイド練習中!です!

SwiftのライブラリMoyaを使った

iOSのネットワーク周りのライブラリといったらAlamofireですよね.
ただAlamofireは十分に抽象化されていないのでラッパーを採用したくなります.
抽象化されたものとしてAPIKitなどもありますがどうも痒いところに手が届かなかった印象です.
自分で書いてもいいんですが大変...

というわけでAlamofireのラッパーかつRxとかにも対応しているMoyaを使ってみました.
僕はRx使わないんですけどね.

github.com

引数なしのメソッドを一つ実装してみる

とりあえず簡単なのを実装してみます.

1. enumAPIを叩くときのメソッドを宣言

ここにメソッドを突っ込みます.

enum HogeAPI {
    case getNewPhoto()
}

2. extensionでメソッドに対するAPIの挙動を列挙

extension HogeAPI: TargetType {
    var baseURL: URL { return URL(string: "https://api.hogehgoegehogegeohgeh.com")! }
    var path: String {
        switch self {
        case .getNewPhoto():
            return "/photos"
        }
    }
    var method: Moya.Method {
        switch self {
        case .getNewPhoto:
            return .get
        }
    }
    var parameters: [String: Any]? {
        switch self {
        case .getNewPhoto:
            return ["client_id": "himitsu"]
        }
    }
    var parameterEncoding: ParameterEncoding {
        switch self {
        case .getNewPhoto:
            return URLEncoding.default
        }
    }
    var sampleData: Data {
        switch self {
        case .getNewPhoto:
            return "mendoikarayouisitenai".data(using: .utf8)!
        }
    }
    var task: Task {
        switch self {
        case .getNewPhoto:
            return .request
        }
    }
}

3. プロバイダとかいうのを宣言してリクエスト投げる

let provider = MoyaProvider<HogeAPI>()
        provider.request(.getNewPhoto()) { result in

あとはAlamofireの要領でなんとかしたら終わりです.

感想

ほぼサンプル通りでしたが,いい感じに抽象化されてていいんじゃないでしょうか.
この後はObjectMapperでJSONをパースしてCollectionViewに突っ込みます.予定です.