Moya

如在OC中使用AFNetworking一般,Swift我們用Alamofire來做網絡庫.而Moya在Alamofire的基礎上又封裝了一層:

Moya.png

官方介紹里說Moya有幾個比較好的特性:

  • 編譯時檢查正確的API端點訪問.
  • 使你定義不同端點枚舉值對應相應的用途更加明晰.
  • 提高測試地位從而使單元測試更加容易.
    Moya已經在Artsy's new auction app上使用,可以下載代碼來看看.
    不過官方還有個例子文檔,大致內容為:
    首先定義個借口地址的枚舉:
enum GitHub { 
case Zen 
case UserProfile(String)
}

這個枚舉需要遵守MoyaTarget協議:

private extension String { 
var URLEscapedString: String {
 return self.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet()) 
}
}
private extension String {
    var URLEscapedString: String {
        return self.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
    }
}
extension GitHub : MoyaTarget {
    var baseURL: NSURL { return NSURL(string: "https://api.github.com") }
    var path: String {
        switch self {
        case .Zen:
            return "/zen"
        case .UserProfile(let name):
            return "/users/\(name.URLEscapedString)"
        }
    }
    var method: Moya.Method {
        return .GET
    }
    var parameters: [String: AnyObject]? {
        return nil
    }
    var sampleData: NSData {
        switch self {
        case .Zen:
            return "Half measures are as bad as nothing at all.".dataUsingEncoding(NSUTF8StringEncoding)!
        case .UserProfile(let name):
            return "{\"login\": \"\(name)\", \"id\": 100}".dataUsingEncoding(NSUTF8StringEncoding)!
        }
    }
}

設置好基礎url、參數、方法等,接下來設置最終的API地址:

public func url(route: MoyaTarget) -> String {
    return route.baseURL.URLByAppendingPathComponent(route.path).absoluteString
}

let endpointClosure = { (target: GitHub, method: Moya.Method, parameters: [String: AnyObject]) -> Endpoint<GitHub> in
    return Endpoint<GitHub>(URL: url(target), method: method, parameters: parameters, sampleResponseClosure: {.NetworkResponse(200, target.sampleData)})
}

可以設置網絡錯誤或超時的情況:

let failureEndpointClosure = { (target: GitHub, method: Moya.Method, parameters: [String: AnyObject]) -> Endpoint<GitHub> in
    let sampleResponseClosure = { () -> (EndpointSampleResponse) in
        if shouldTimeout {
            return .NetworkError(NSError())
        } else {
            return .NetworkResponse(200, target.sampleData)
        }
    }()
    return Endpoint<GitHub>(URL: url(target), method: method, parameters: parameters, sampleResponseClosure: sampleResponseClosure)
}

接下來創建我們需要的網絡層:

// Tuck this away somewhere where it'll be visible to anyone who wants to use it
var provider: MoyaProvider<GitHub>!

// Create this instance at app launch
let provider = MoyaProvider(endpointClosure: endpointClosure)

我們調用時非常簡單:

provider.request(.Zen, completion: { (data, statusCode, response, error) in
    if let data = data {
        // do something with the data
    }
})

Girl學iOS100天 第7天

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 文章摘自Moya官方文檔 Targets Moya的使用始于定義一個target——典型的是定義一個符合Targe...
    Jt_Self閱讀 16,242評論 0 27
  • RxSwift+Moya之項目實戰 RxSwift相關基本介紹和用法可參考: RxSwift的使用詳解01 RxS...
    TitanCoder閱讀 7,890評論 5 30
  • 原文地址:https://github.com/Moya/Moya/tree/master/docs參考文章:ht...
    狂奔的兔子閱讀 3,392評論 0 53
  • Moya最新版本11.0.2 由于前段時間寫了這篇文章,最新Moya已更新最新版本,故此也更新了下用法,本人已使用...
    Lewis海閱讀 29,930評論 14 84
  • 壹 孟十一看了一眼坐在對面的人,很無奈,開口道,“我不喜歡姑娘,所以,對不起?!?對面的姑娘先是愣了一會,而后笑道...
    大錢小胖閱讀 967評論 6 15