2017-02-01 2 views
1

Ich habe die folgende Funktion in meiner WebService-Klasse:Mapping moya Ergebnis mit moya_modelMapper

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

Und in meinem TransportViewModel habe ich diese Methode init:

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)] 
     }  
    } 

Das Problem ist, es in meinem flatMap kommt Methode, aber es kommt nie innerhalb der map unter der flatMap.

Wenn ich hinzufügen, einen Teil meiner Webservice Funktion wie diese abonnieren:

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) 

ich sehe, dass meine Antwort richtig gedruckt wird. Kann mir jemand dabei helfen?

+0

Bitte senden Sie uns eine Antwort JSON und 'TransportResponse' Modell. – sunshinejr

Antwort

3

Das Problem ist, dass Ihr Provider freigegeben wird, sobald loadTransport() Methode beendet ist.

Sie verwenden die alte Version von Moya. Bis diese pull requestRxMoyaProvider schwach erfasst wurde, würde die gesamte Kette überhaupt kein Ereignis aussenden (next/error/completed).

Um dies zu beheben, verdeckte Anbieter zu einer Klasse-Bereichs-Variablen:

class Webservice { 
    var provider: RxMoyaProvider<TransportService>? 
} 

Und es wie folgt verwenden:

self.provider = RxMoyaProvider<TransportService>(endpointClosure: endpointClosure, plugins: [NetworkLoggerPlugin(verbose: true)]) 
return self.provider! 
    .request(TransportService.nmbs) 
    .filterSuccessfulStatusCodes() 
    .mapArray(type: TransportResponse.self) 
+0

Sie sind richtig! – Steaphann

Verwandte Themen