疑问:
MoyaProvider
只能使用静态常量创建才可以使用Rxswift去订阅返回的消息吗?
// 登录请求(使用该方式时, 该请求始终不执行)
func login(account: String, password: String) -> Observable<YYAccountLoginResult> {
let target = MultiTarget(ApiUser.login(phone: account, password: password))
let provider = MoyaProvider<MultiTarget>()
return provider.rx.request(target)
.asObservable()
.filterSuccessfulStatusCodes()
.mapJSON()
.mapObject(type: LoginModel.self)
.showAPIErrorToast()
.flatMapLatest({ (model) in
return Observable.just(YYAccountLoginResult.success(message: "登录成功", data: model))
})
// 使用以下代码会去执行请求,但是违背了原则,并执行了两次api请求
// .subscribe()
}
static let provider =
MoyaProvider<MultiTarget>()
// 登录请求(MoyaProvider使用静态常量创建时以下代码执行正常)
func login(account: String, password: String) -> Observable<YYAccountLoginResult> {
let target = MultiTarget(ApiUser.login(phone: account, password: password))
return LoginService.provider.rx.request(target)
.asObservable()
.filterSuccessfulStatusCodes()
.mapJSON()
.mapObject(type: LoginModel.self)
.showAPIErrorToast()
.flatMapLatest({ (model) in
return Observable.just(YYAccountLoginResult.success(message: "登录成功", data: model))
})
}
需求: 想通过一些参数创建不同的MoyaProvider; 比如是否出现加载框,该请求是否需要缓存,该请求是否需要验证token是否过期?
原因: 由于每个请求都需要创建MoyaProvider,然后想通过这种方式统一管理
结果造成上述无法访问的问题,由于刚接触rxswift理解不够深入,希望有时间,会的人指教啦,谢谢
/// 在所有url后面拼接key参数
private func endpointMapping<Target: TargetType>(target: Target) -> Endpoint {
let defaultEndpoint = MoyaProvider.defaultEndpointMapping(for: target)
let baseUrl = defaultEndpoint.url.appending("?key=\(mobAppKey)")
return Endpoint(url: baseUrl, sampleResponseClosure: { .networkResponse(200, target.sampleData)}, method: target.method, task: target.task, httpHeaderFields: target.headers)
}
private func stubMapping<Target: TargetType>(_: Target) -> StubBehavior {
// 实时请求api
// return StubBehavior.never
// 模拟请求(延迟1秒使用sampleData中的测试数据返回)
return StubBehavior.delayed(seconds: 1)
}
// 创建moya请求类
@discardableResult
static func provider(_ providerType: ProviderType) -> MoyaProvider<MultiTarget> {
switch providerType {
case .loding:
return MoyaProvider<MultiTarget>(endpointClosure: endpointMapping,
stubClosure: stubMapping,
plugins: [NetworkLoggerPlugin(verbose: true),
newworkActivityPlugin,
RequestLoadingPlugin(true),
AuthPluginToken()])
case .noLoading:
return MoyaProvider<MultiTarget>(endpointClosure: endpointMapping,
stubClosure: stubMapping,
plugins: [NetworkLoggerPlugin(verbose: true),
newworkActivityPlugin,
RequestLoadingPlugin(false),
AuthPluginToken()])
}
}