返回 导航

Swift

hangge.com

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)

回到顶部