Moya: 多Target调用统一接口
之前已经介绍了, 利用泛型将后台返回数据, 通过接口传递到外部调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| struct GenericApi<Target: TargetType> {
let provider = MoyaProvider<Target>.appearance()
func request<ModelT>(target: Target, mapModel: ModelT.Type, completion: @escaping (MoyaResult<ModelT>)->Void ) -> Cancellable { return provider.request(target) { (result) in switch result { case .success(let resp): completion(resp.mapModel(resp: resp)) case .failure(let moyaErr): print("无网络请求") completion(.failure(moyaErr.errorCode, moyaErr.errorDescription!)) } } } }
|
作为NetworkLayer 层, 还需要满足多个模块的 Target,调用相同 API,获取接口返回信息处理这个需求
多 Target 用法
上面的逻辑如果已经理解清楚了, 下面多 Target 就更好理解.
已经结构体内部 GenericApi
已经满足外部传递 TargetType 进来了, 这里只需要创建多个GenericApi
实例即可.
1 2 3
| let kCodeApi = GenericApi<RegisteTarget>() let kLoginApi = GenericApi<LoginTarget>()
|
调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| codeButton.rx.tap.asObservable() .flatMapLatest({ _ -> Observable<String> in kCodeApi .request(.code(phone: phone.value, type: .forgetPWD), mapModel: Void.self) .trackActivity(codeNetworking) .flatMapLatest({ result -> Observable<String> in switch result { case .success: return timer.fire() case .failure(_, let errmsg): HUD.alert(msg: errmsg) return .empty() } }) }) .bind(to: codeButton.rx.title(for: .normal)) .disposed(by: disBag)
|
通过 kCodeApi 结构体调用.request 方法 传递参数, mapModel 如果不需要接收后台数据,就传 Void 类型进去
1. Moya 基本概念
2. Moya 和 Alamofire 关系
3. Moya 开发应用篇 1
4. Moya 开发应用篇 2