用 moya_modelMapper 映射 moya 结果
Mapping moya result with moya_modelMapper
我的网络服务中有以下功能 class:
func loadTransport() -> Observable<[TransportResponse]> {
let nonce = "\(Date().timeIntervalSince1970)"
let csaKey = try! config.apikey()
let csaSecret = try! config.apiSecret()
let csaSignature = crypto.generateSignature(nonce: nonce, url: "http://*****/v1/nmbs", body: "", secret: csaSecret)
print("SIGNATURE = \(csaSignature)")
let endpointClosure = { (target: TransportService) -> Endpoint<TransportService> in
let url = target.baseURL.appendingPathComponent(target.path).absoluteString
let endpoint = Endpoint<TransportService>(URL: url, sampleResponseClosure: {.networkResponse(200, target.sampleData)}, method: target.method, parameters: target.parameters)
return endpoint.adding(newHttpHeaderFields: ["CSA-KEY": csaKey,"CSA-NONCE": nonce,"CSA-SIGNATURE": csaSignature])
}
let provider = RxMoyaProvider<TransportService>(endpointClosure: endpointClosure, plugins: [NetworkLoggerPlugin(verbose: true)])
return provider
.request(TransportService.nmbs)
.filterSuccessfulStatusCodes()
.mapArray(type: TransportResponse.self)
}
在我的 TransportViewModel 中我有这个初始化方法:
init(webService: Webservice) {
self.webService = webService
title.value = String.localizedString(key: "transport_title")
transportResponse = active.asObservable()
.filter { [=12=] }
.flatMap { _ in
return webService.loadTransport()
}
.map { response in
return [TransportData(items: response)]
}
}
问题是它出现在我的 flatMap
方法中,但它从未出现在 flatMap
下面的 map
中。
当我像这样向我的网络服务功能添加订阅部分时:
let provider = RxMoyaProvider<TransportService>(endpointClosure: endpointClosure, plugins: [NetworkLoggerPlugin(verbose: true)])
provider
.request(TransportService.nmbs)
.filterSuccessfulStatusCodes()
.mapArray(type: TransportResponse.self)
.subscribe { event in
switch event {
case .next(let response):
print(response)
case .error(let error):
print(error)
default: break
}
}.addDisposableTo(disposeBag)
我看到我的回复打印正确。
有人可以帮我解决这个问题吗?
问题是您的提供者在 loadTransport()
方法完成后立即被释放。
您使用的是旧版Moya。直到这个 pull request RxMoyaProvider
被弱捕获,所以整个链根本不会发出任何事件 (next/error/completed).
要解决这个问题,请将提供程序隐藏到 class-scoped 变量:
class Webservice {
var provider: RxMoyaProvider<TransportService>?
}
并像这样使用它:
self.provider = RxMoyaProvider<TransportService>(endpointClosure: endpointClosure, plugins: [NetworkLoggerPlugin(verbose: true)])
return self.provider!
.request(TransportService.nmbs)
.filterSuccessfulStatusCodes()
.mapArray(type: TransportResponse.self)
我的网络服务中有以下功能 class:
func loadTransport() -> Observable<[TransportResponse]> {
let nonce = "\(Date().timeIntervalSince1970)"
let csaKey = try! config.apikey()
let csaSecret = try! config.apiSecret()
let csaSignature = crypto.generateSignature(nonce: nonce, url: "http://*****/v1/nmbs", body: "", secret: csaSecret)
print("SIGNATURE = \(csaSignature)")
let endpointClosure = { (target: TransportService) -> Endpoint<TransportService> in
let url = target.baseURL.appendingPathComponent(target.path).absoluteString
let endpoint = Endpoint<TransportService>(URL: url, sampleResponseClosure: {.networkResponse(200, target.sampleData)}, method: target.method, parameters: target.parameters)
return endpoint.adding(newHttpHeaderFields: ["CSA-KEY": csaKey,"CSA-NONCE": nonce,"CSA-SIGNATURE": csaSignature])
}
let provider = RxMoyaProvider<TransportService>(endpointClosure: endpointClosure, plugins: [NetworkLoggerPlugin(verbose: true)])
return provider
.request(TransportService.nmbs)
.filterSuccessfulStatusCodes()
.mapArray(type: TransportResponse.self)
}
在我的 TransportViewModel 中我有这个初始化方法:
init(webService: Webservice) {
self.webService = webService
title.value = String.localizedString(key: "transport_title")
transportResponse = active.asObservable()
.filter { [=12=] }
.flatMap { _ in
return webService.loadTransport()
}
.map { response in
return [TransportData(items: response)]
}
}
问题是它出现在我的 flatMap
方法中,但它从未出现在 flatMap
下面的 map
中。
当我像这样向我的网络服务功能添加订阅部分时:
let provider = RxMoyaProvider<TransportService>(endpointClosure: endpointClosure, plugins: [NetworkLoggerPlugin(verbose: true)])
provider
.request(TransportService.nmbs)
.filterSuccessfulStatusCodes()
.mapArray(type: TransportResponse.self)
.subscribe { event in
switch event {
case .next(let response):
print(response)
case .error(let error):
print(error)
default: break
}
}.addDisposableTo(disposeBag)
我看到我的回复打印正确。 有人可以帮我解决这个问题吗?
问题是您的提供者在 loadTransport()
方法完成后立即被释放。
您使用的是旧版Moya。直到这个 pull request RxMoyaProvider
被弱捕获,所以整个链根本不会发出任何事件 (next/error/completed).
要解决这个问题,请将提供程序隐藏到 class-scoped 变量:
class Webservice {
var provider: RxMoyaProvider<TransportService>?
}
并像这样使用它:
self.provider = RxMoyaProvider<TransportService>(endpointClosure: endpointClosure, plugins: [NetworkLoggerPlugin(verbose: true)])
return self.provider!
.request(TransportService.nmbs)
.filterSuccessfulStatusCodes()
.mapArray(type: TransportResponse.self)