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

[复制链接]
64 1
疑问: 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) in
return 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) in
return 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请求类
@discardableResult
static func provider(_ providerType: ProviderType) -> MoyaProvider {
switch providerType {
case .loding:
return MoyaProvider(endpointClosure: endpointMapping,
stubClosure: stubMapping,
plugins: [NetworkLoggerPlugin(verbose: true),
newworkActivityPlugin,
RequestLoadingPlugin(false),
AuthPluginToken()])
case .noLoading:
return MoyaProvider(endpointClosure: endpointMapping,
stubClosure: stubMapping,
plugins: [NetworkLoggerPlugin(verbose: true),
newworkActivityPlugin,
RequestLoadingPlugin(false),
AuthPluginToken()])
}
}

举报 使用道具

回复

1 个评论

tandangdang  注册会员  发表于 2019-3-27 18:39:28  | 显示全部楼层
疑问: 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()])
        }
    }

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

ios.irunthink.com
搜索
热搜: iOS swift 下拉刷新

图文热点

更多

开发教程

更多

客服中心

400-800 周一至周日 9:30-17:30 仅收市话费

关注我们

  • 微信扫描
  • 关注微信
关于我们
关于我们
友情链接
联系我们
帮助中心
精贴推荐
源码上传
注册登录
服务支持
资源下载
关注我们
官方微博
官方空间
快速回复 返回顶部 返回列表