我的webservice类中有以下函数:
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 { $0 }
.flatMap { _ in
return webService.loadTransport()
}
.map { response in
return [TransportData(items: response)]
}
}问题是它出现在我的flatMap方法中,但它从来没有出现在flatMap下面的map中。
当我将订阅部分添加到我的webservice函数时,如下所示:
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)我看到我的响应被正确打印出来了。有人能帮我吗?
发布于 2017-02-01 18:59:48
问题是,一旦loadTransport()方法完成,您的提供程序就会被释放。
您正在使用旧版本的Moya。直到这个错误被弱捕获,所以整个链根本不会发出任何事件( pull request / RxMoyaProvider /completed)。
为了解决这个问题,将提供者隐含到类范围的变量中:
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)https://stackoverflow.com/questions/41975515
复制相似问题