Как использовать Мойя RxSwift, чтобы объединить массив REST - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь выучить RxSwift. Я использовал Moya и теперь хочу попробовать свои силы в RxSwift. Полностью смущен.

 let popServiceProvider = MoyaProvider<PopRESTService>()
    let o1 = popServiceProvider.rx.request(.getPopByCity(city: "London")).asObservable()
    let o2 = popServiceProvider.rx.request(.getPopByCity(city: "Tokyo")).asObservable()

    let pObservables:[Observable<Response>] = [o1, o2]
    let stats: Observable<Response> = Observable.combineLatest(pObservables)
    let m = stats.map({ a in
        print(a)
    })  

Сначала я получаю сообщение об ошибке на статистике let:

Невозможно преобразовать значение типа «Наблюдаемый <[Ответ]>» в указанный тип «Наблюдаемый»

Я даже иду в правильном направлении?

EDIT:

Даже это не работает. Никогда не подписывайтесь сначала:

   wServiceProvider.rx.request(.getWeatherByCity(city: "Chicago"))
    .debug()
    .map(Weather.self)
    .subscribe({ (event) in
        switch event {
        case let .success(response):
            print(response)

        case let .error(response):
            print(response)
        }
    })
    .disposed(by: self.disposeBag)

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Мое недопонимание Apple XCTest.Мне нужно было добавить:

                expectation.fulfill()

в моей подписке.

Observable.combineLatest([o1, o2])
        .map { (responses: [Response]) -> [Weather] in
            responses.map { try? JSONDecoder().decode(Weather.self, from: $0.data) }
                .compactMap { $0 }
        }
        .debug()
        .subscribe(onNext: { (result: [Weather]) in
            print(result)
            expectation.fulfill()

        })
        .disposed(by: disposeBag)
0 голосов
/ 01 июня 2019

Я рекомендую использовать Observable.combineLatest(o1, o2) вариант combineLatest (эта форма ограничена 8 аргументами)

Предполагается, что тип, возвращаемый из case getPopByCity(city: String), может выглядеть следующим образом:

struct PopByCity: Decodable {
  let count: Float
}

вы, вероятно, хотите реализовать запрос следующим образом:

Observable.combineLatest(o1, o2)
  .map { (resp1: Response, resp2: Response) -> [PopByCity] in
    let pop1 = try? JSONDecoder().decode(PopByCity.self, from: resp1.data)
    let pop2 = try? JSONDecoder().decode(PopByCity.self, from: resp2.data)
    return [pop1, pop2].compactMap { $0 }
  }
  .subscribe(onNext: { (result: [PopByCity]) in
    print(result)
  })
  .disposed(by: disposeBag)

Но если вам все еще нужен массив запросов:

Observable.combineLatest([o1, o2])
  .map { (responses: [Response]) -> [PopByCity] in
    responses.map { try? JSONDecoder().decode(PopByCity.self, from: $0.data) }
      .compactMap { $0 }
  }
  .subscribe(onNext: { (result: [PopByCity]) in
    print(result)
  })
  .disposed(by: disposeBag)

Для второго варианта имейте в виду, что онНе рекомендуется отправлять тонны асинхронных запросов одновременно.Для выполнения многих запросов я рекомендую использовать оператор Concat или комбинацию Concat + Уменьшить , если вам приходится обрабатывать все ответы в одном месте после последнего ответа.

...