1

我的网络服务类中有以下功能:

 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方法中,但它从来没有出现mapflatMap.

当我像这样向我的网络服务功能添加订阅部分时:

 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)

我看到我的回复打印正确。有人可以帮我吗?

4

1 回答 1

3

问题是,一旦loadTransport()方法完成,您的提供程序就会被释放。

您使用的是旧版本的 Moya。直到这个拉取请求 RxMoyaProvider被弱捕获,所以整个链根本不会发出任何事件(下一个/错误/完成)。

为了解决这个问题,一个类范围变量的隐蔽提供者:

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)
于 2017-02-01T10:59:47.547 回答