Swift網絡請求(Moya篇)


  在使用Alamofire進行網絡請求的時候,相信大部分的同學都會封裝一個抽象的NetworkLayer,如"APIManager" 或者 "NetworkModel"等等。但是位置業務功能增加,會漸漸混合各種請求,不夠清晰,而Moya能很好地解決這類問題。Moya在Alamofire基礎上進行封裝,是一個允許高度自定義的網絡層,可以根據具體的需求進行接口的設置。具體的介紹可以參考Moya的官方鏈接,結構圖如下:

 

  接下來就介紹一下Moya的一些常見的用法:

(一)根據業務需求創建具體請求:

  打比方現在我們需要書寫賬戶的相關接口,如Login、userInfo。那么首先我們得創建AccountService:

enum AccountService {
    case login(phoneNum: NSInteger,passWord: NSInteger)
    case logout
}

  然后讓AccountService實現TargetType協議,定義請求需要的基本信息:

extension AccountService: TargetType {
    var baseURL: URL {
        return URL(string: ServiceBaseURL)!
    }
    
    var path: String {
        switch self {
        case .login(_, _):
            return "accountService/login"
        case .logout:
            return "accountService/logout"
        }
    }
    
    var method: Moya.Method {
        switch self {
        case .login(_, _):
            return .post
        case .logout:
            return .get
        }
    }
    
    var parameters: [String: Any]? {
        switch self {
        case .login(let phoneNum, let passWord):
            return ["phoneNum": phoneNum, "passWord": passWord]
        case .logout:
            return nil
        }
    }
    
    var parameterEncoding: ParameterEncoding {
        return JSONEncoding.default // Send parameters as JSON in request body
    }
    
    var sampleData: Data {
        return "".data(using: .utf8)!
    }
    
    var task: Task {
        return .request
    }
    
}

  如上我們就已經完成了網絡請求所需要的一個endpoint。接着通過Moya提供一個發送請求的Provider就完成了基本的使用:

let provider = MoyaProvider<AccountService>()

provider.request(.login(phoneNum: 12345678901, passWord: 123456)) { result in
            switch result { case let .success(response): //............... break case let .failure(error): //............... break } }
 
        

(二)通過HTTPHeader設置公共請求參數

  在實際開發中我們可能會需要在請求頭內添加一些公共請求參數,如用於識別一些平台標志、辨別接口的版本號。你可以定義一個Endpoint的閉包,

let publicParamEndpointClosure = { (target: AccountService) -> Endpoint<AccountService> in
            let url = target.baseURL.appendingPathComponent(target.path).absoluteString
            let endpoint = Endpoint<AccountService>(url: url, sampleResponseClosure: { .networkResponse(200, target.sampleData) }, method: target.method, parameters: target.parameters, parameterEncoding: target.parameterEncoding)
            return endpoint.adding(newHTTPHeaderFields: ["x-platform" : "iOS", "x-interface-version" : "1.0"])
        }

  然后在創建請求的Provider把它添加上去,

let provider = MoyaProvider(endpointClosure: publicParamEndpointClosure)

(三)通過插件的方式監聽網絡狀態

  通常我們會在進行網絡請求的時候進行一些狀態展示,如loading,那么你可以通過插件的方式來實現。Moya默認有4個插件:

  • AccessTokenPlugin 管理AccessToken的插件
  • CredentialsPlugin 管理認證的插件
  • NetworkActivityPlugin 管理網絡狀態的插件
  • NetworkLoggerPlugin 管理網絡log的插件

  在這里就演示一下NetworkActivityPlugin的使用:

let networkPlugin = NetworkActivityPlugin { (type) in
            switch type {
            case .began:
                NSLog("顯示loading")
            case .ended:
                NSLog("隱藏loading")
            }
        }

  同樣在創建請求的Provider把它添加上去即可

let provider = MoyaProvider<AccountService>(plugins: [networkPlugin])

  當然你也可以自定義一些功能的插件,只需要實現PluginType協議,具體功能實現可參考Moya默認的插件:

final class CustomPlugin: PluginType {
    
    // MARK: Plugin
 
}

(四)設置接口的超時時間

  一般網絡的請求需要根據具體的業務接口設置合適的超時時間,你可以參照一下方法進行設置,

let requestTimeoutClosure = { (endpoint: Endpoint<AccountService>, done: @escaping MoyaProvider<AccountService>.RequestResultClosure) in
            
            guard var request = endpoint.urlRequest else { return }
            
            request.timeoutInterval = 30    //設置請求超時時間
            done(.success(request))
        }

  同樣在創建請求的Provider把它添加上去即可

let provider = MoyaProvider<AccountService>(requestClosure: requestTimeoutClosure)

  至此,使用Moya進行網絡請求的基本用法已經介紹完了,主要是記錄一下只是葯店,當然也希望能對大家有點用處,謝謝!

資料參考:

http://www.jianshu.com/p/38fbc22a1e2b

https://github.com/Moya/Moya

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM