Swift - 网络抽象层库Moya的使用详解7(多个target使用同一个Provider)
作者:hangge | 2017-10-18 08:10
十二、多个 target 共用一个 Provider
在之前的样例中,我们都是一个 target 对应一个 Provider。有时我们程序会根据业务逻辑拆分成多个 target,这样 target 可能就会有很多个,如果有多少个 target 我们就创建多少个 Provider,会让应用程序的逻辑复杂化。特别是当它们使用同样的 plugins 或 closures 时,又要做一些额外的工作去维护。其实借助 MultiTarget,我们可以让多个 target 都使用相同的 Provider。
1,假设我们有如下两个 target
(1)DouBan.swift
import Moya //请求分类 public enum DouBan { case channels //获取频道列表 } //请求配置 extension DouBan: TargetType { //服务器地址 public var baseURL: URL { switch self { case .channels: return URL(string: "https://www.douban.com")! } } //各个请求的具体路径 public var path: String { switch self { case .channels: return "/j/app/radio/channels" } } //请求类型 public var method: Moya.Method { return .get } //请求任务事件(这里附带上参数) public var task: Task { return .requestPlain } //是否执行Alamofire验证 public var validate: Bool { return false } //这个就是做单元测试模拟的数据,只会在单元测试文件中有作用 public var sampleData: Data { return "{}".data(using: String.Encoding.utf8)! } //请求头 public var headers: [String: String]? { return nil } }
(2)Httpbin.swift
import Moya //请求分类 public enum Httpbin { case anything(String) //请求数据 } //请求配置 extension Httpbin: TargetType { //服务器地址 public var baseURL: URL { return URL(string: "http://httpbin.org")! } //各个请求的具体路径 public var path: String { switch self { case .anything(_): return "/anything" } } //请求类型 public var method: Moya.Method { return .post } //请求任务事件(这里附带上参数) public var task: Task { switch self { case .anything(let param1): var params: [String: Any] = [:] params["param1"] = param1 return .requestParameters(parameters: params, encoding: URLEncoding.default) } } //是否执行Alamofire验证 public var validate: Bool { return false } //这个就是做单元测试模拟的数据,只会在单元测试文件中有作用 public var sampleData: Data { return "{}".data(using: String.Encoding.utf8)! } //请求头 public var headers: [String: String]? { return nil } }
2,Provider 定义
过去一一对应时我们会定义两个 Privider:
let DouBanProvider = MoyaProvider<DouBan>() let HttpbinProvider = MoyaProvider<Httpbin>()
现在使用多个 target 的 Privider 可以这么定义:
let provider = MoyaProvider<MultiTarget>()
3,Provider 使用
过去一一对应时我们这么使用 Privider:DouBanProvider.request(.channels) { result in // do something with `result` } HttpbinProvider.request(.anything("hangge.com")) { result in // do something with `result` }
现在使用多个 target 的 Privider 这么使用:
provider.request(MultiTarget(DouBan.channels)) { result in // do something with `result` } provider.request(MultiTarget(Httpbin.anything("hangge.com"))) { result in // do something with `result` }
全部评论(3)
多个target ,对应一个provider 。但是插件怎么配置,不同的target有不同的插件
站长回复:当然是使用相同插件的target才使用同一个provider,这样也便于维护。而插件的配置方法和普通的provider都是一样的。
用的时候,总是提示Use of unresolved identifier 'MultiTarget'
站长回复:我测试了下没问题啊,你是不是Moya没配置好。
这篇文章Moya版本是不是旧的,我用时,TargetType 里面 headers
站长回复:用的是最新版本的。不知你用时遇到什么问题。