用 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)