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