扬庆の博客

Moya(4) 开发应用篇3

字数统计: 356阅读时长: 1 min
2021/04/07 Share

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

CATALOG
  1. 1. Moya: 多Target调用统一接口
    1. 1.0.1. 多 Target 用法
    2. 1.0.2. 调用