Отображение результата moya с помощью 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)
    }

И в моей 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, но никогда не входит в map ниже flatMap.

Когда я добавляю часть подписки в свою функцию веб-сервиса следующим образом:

 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)

Я вижу, что мой ответ напечатан правильно. Может ли кто-нибудь помочь мне с этим?


person Steaphann    schedule 01.02.2017    source источник
comment
Пожалуйста, отправьте ответ в формате JSON и TransportResponse модели.   -  person sunshinejr    schedule 01.02.2017


Ответы (1)


Проблема в том, что ваш провайдер освобождается, как только метод loadTransport() завершается.

Вы используете старую версию Moya. Пока этот pull request 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)
person turekj    schedule 01.02.2017