RX Swift - Параллельное выполнение API - PullRequest
0 голосов
/ 04 июля 2018

Я хочу использовать RX таким образом, чтобы он загружал данные из нескольких API и объединял их все. Все они будут выполняться параллельно, а затем объединять данные из ответов всех из них. Я выполняю их во вложенных вызовах здесь, и я хотел бы преобразовать код.

public func searchListings(searchState: SearchState,
                             renderState: SearchRenderState) -  Observable<PropertyNetworkResponse  {
        return Observable.create({ (observer) -  Disposable in

      _ = self.getXData(searchState: searchState, renderState: renderState).subscribe(onNext: { (xData) in

        _ = self.getYData(searchState: searchState, renderState: renderState).subscribe(onNext: { (yData) in

          _ = self.getZData(searchState: searchState, renderState: renderState).subscribe(onNext: { (zData) in

          let results = xData + yData + zData


          observer.onNext(resultNetworkResponse)
          observer.onCompleted()

          }, onError: { (error) in

            observer.onError(error)

          }, onCompleted: nil, onDisposed: nil)
        }, onError: { (error) in

          observer.onError(error)

        }, onCompleted: nil, onDisposed: nil)

      }, onError: { error in

        observer.onError(error)

      }, onCompleted: nil, onDisposed: nil)

      return Disposables.create()   
    }) 
  }

1 Ответ

0 голосов
/ 18 июля 2018

Недавно я столкнулся с подобной проблемой, и мне удалось сделать параллельные сетевые вызовы, используя zip. Попробуйте следующий код:

public func searchListings(searchState: SearchState,
                         renderState: SearchRenderState) -  Observable<PropertyNetworkResponse  {

    let observableX = self.getXData(searchState: searchState, renderState: renderState)
    let observableY = self.getYData(searchState: searchState, renderState: renderState)
    let observableZ = self.getZData(searchState: searchState, renderState: renderState)   

    return Observable.create({ (observer) -> Disposable in

        _ = Observable.zip(observableX, observableY, observableZ) { ($0, $1, $2) }
        .subscribe(onNext: { xData, yData, zData in
            let result = xData + yData + zData

            observer.onNext(resultNetworkResponse)
            observer.onCompleted()
        })
        return Disposables.create()   
    }) 
}

Пожалуйста, найдите информацию о том, как zip работает в этой ссылке

...