moya与rxswift结合使用时; 创建的MoyaProvider 无法发起请求?

宇阳-想飞 2018-06-27 03:29:41
疑问: 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(false),
AuthPluginToken()])
case .noLoading:
return MoyaProvider<MultiTarget>(endpointClosure: endpointMapping,
stubClosure: stubMapping,
plugins: [NetworkLoggerPlugin(verbose: true),
newworkActivityPlugin,
RequestLoadingPlugin(false),
AuthPluginToken()])
}
}


...全文
374 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

29,027

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧