
主要是添加了baseUrl省去了每次创建接口都要写的步骤
extension targettype { public var baseURL: URL { return URL(string: "https://API.github.com/")! }} 2.创建接口 enum Github { case repositorIEs(q: String,sort: String)} 3.拓展接口 extension Github: targettype { var path: String { switch self { case .repositorIEs: return "search/repositorIEs" } } var method: Moya.Method { switch self { case .repositorIEs: return .get } } var parameters: [String: Any]? { switch self { case .repositorIEs(let q,let sort): return ["q": q,"sort": sort] } } var parameterEnCoding: ParameterEnCoding { return URLEnCoding.default } var task: Task { return .request } var sampleData: Data { switch self { case .repositorIEs: return "".utf8Encoded } }}extension String { var urlEscaped: String { return self.addingPercentEnCoding(withAllowedCharacters: .urlHostAllowed)! } var utf8Encoded: Data { return self.data(using: .utf8)! }} 参数说明 path 就是API的地址了(该demo完整的URL是https://api.github.com/search/repositories?q=javascript&sort=stars) method 请求的方式:get/post parameters API参数,以Map形式提交 parameterEnCoding 参数的格式 task 该条请API求的方式,request、upload、download sampleData 这个是做单元测试模拟的数据,必须要实现,只在单元测试文件中有作用 4.创建一个ProvIDer let GithubRxProvicer = RxMoyaProvIDer<Github>(plugins: [NetworkLoggerPlugin(verbose: true,responseDataFormatter: JsONResponseDataFormatter),networkActivityPlugin])private func JsONResponseDataFormatter(_ data: Data) -> Data { do { let dataAsJsON = try JsONSerialization.JsonObject(with: data) let prettyData = try JsONSerialization.data(withJsONObject: dataAsJsON,options: .prettyPrinted) return prettyData } catch { return data //fallback to original data if it cant be serialized }}let networkActivityPlugin = NetworkActivityPlugin { (change) -> () in switch(change) { case .ended: UIApplication.shared.isNetworkActivityIndicatorVisible = false case .began: UIApplication.shared.isNetworkActivityIndicatorVisible = true }}补充
Moya在初始化ProvIDer的时候可以传入一些插件,Moya库中默认有4个插件。
AccesstokenPlugin 管理Accesstoken的插件 CredentialsPlugin 管理认证的插件 NetworkActivityPlugin 管理网络状态的插件 NetworkLoggerPlugin 管理网络log的插件且,自己也可以创建plugin;比如:
class RequestAlertPlugin: PluginType { private let vIEwController: UIVIEwController init(vIEwController: UIVIEwController) { self.vIEwController = vIEwController } func willSend(request: RequestType,target: targettype) { //do your things } func dIDReceive(result: Result<Response,MoyaError>,target: targettype) { guard case Result.failure(_) = result else { return }//只监听失败 // do your things } } 5.使用 GithubRxProvicer.request(.repositorIEs(q: "JavaScript",sort: "stars")) .mapResponsetoObject(type: RepositorIE.self) .subscribe { event in switch event { case .next(let data): print(".next") case .error(let error): print(error) case .completed: print(".completed") } } .disposed(by: disposeBag)补充
Moya也为我们提供了很多Observable的扩展,让我们能更轻松的处理MoyaResponse,常用的如下:
filter(statusCodes:) 过滤response状态码 filterSuccessfulStatusCodes() 过滤状态码为请求成功的 mapJsON() 将请求response转化为JsON格式 mapString() 将请求response转化为String格式 更多使用参考可以参考这篇文章,里面很详细的介绍了moya的各种用法
总结以上是内存溢出为你收集整理的Swift moya - 学习笔记全部内容,希望文章能够帮你解决Swift moya - 学习笔记所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)