Как использовать объединениеЛатест для двух публичных тем в RXSwfit - PullRequest
0 голосов
/ 01 октября 2018

Я новичок в RXSwift, и я пытаюсь использовать объединить последние, чтобы объединить последние результаты из двух общедоступных тем

Что я пытался сделать:

let sub1 = PublicSubject<Type1>()
let sub2 = PublicSubject<Type2>()

NetworkService1.fetch { sub1Value in 
   sub1.onNext(sub1Value)
}

NetworkService2.fetch { sub21Value in 
   sub2.onNext(sub2Value)
}

Observable.combineLatest(sub1.asObservable(), sub2.asObservable()) {
   val1, val2 in 
   // do something with val1 and val2
   // It seems it never hits this block
}

Не уверен, что япоступать правильно.

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Сначала всего пара наблюдений:

  1. Нет PublicSubject, это PublishSubject (возможно, просто опечатка;)

  2. Вам не нужно вызывать asObservable(), чтобы использовать PublishSubjects в качестве аргументов для combineLatest

  3. Вы должны подписаться на свой Observable (в данном случае Observable.combineLatest)иначе ничего не произойдет.

  4. Даже если вы правильно подпишетесь на Observable.combineLatest, вы не получите значения, которые были переданы до подписки, поэтому эти вызовы выборки должныбыть активирован после подписки.

Поскольку фрагмент кода стоит тысячи слов:

let disposeBag = DisposeBag()
let sub1 = PublishSubject<String>()
let sub2 = PublishSubject<String>()

Observable.combineLatest(sub1, sub2) {
  val1, val2 in
  // do something with val1 and val2
  // IT SHOULD WORK NOW
}.subscribe().disposed(by: disposeBag)

NetworkService1.fetch { sub1Value in 
  sub1.onNext(sub1Value)
}

NetworkService2.fetch { sub2Value in 
  sub2.onNext(sub2Value)
}
0 голосов
/ 01 октября 2018

Лучше, если ваш NetworkService вернет Observables.Тогда вам не нужно создавать PublicSubjects, и это более красиво.

Я бы сделал это так:

let result1 = NetworkService1.shared.fetch()
let result2 = NetworkService2.shared.fetch()
Observable.combineLatest(result1, result2) { r1, r2 in
    // Do stuff with r1, r2 with are APIResult<[YourModel]> and return result
}.subscribe(onNext: { result in
    // You need to subscribe to run fetch methods
    // Do stuff with result of combine latest
}).disposed(by: disposeBag)

Это пример метода выборки, использующего Alamofire, которыйвозвращает Observable:

func fetch() -> Observable<APIResult<[YourModel]>> {

    return Observable<APIResult<[YourModel]>>.create { (observer) -> Disposable in

        Alamofire.request(yourURLString,
                          method: .post,
                          parameters: nil,
                          headers: APIManager.headers())
            .responseJSON(completionHandler: { dataResponse in

                switch dataResponse.result {
                case .success(let value):

                    // parse value to someArray here
                    observer.onNext(APIResult.success(someArray))

                case .failure(_):
                    guard let code = dataResponse.response?.statusCode else {
                        observer.onNext(APIResult.failure(APIError.unknownError))
                        break
                    }
                    observer.onNext(APIResult.failure(APIError.networkError(code:code)))
                }

                observer.onCompleted()

            })

        return Disposables.create()
    }

}

APIResult также позволяет передавать ошибки:

enum APIResult<Value> {
    case success(Value)
    case failure(APIError)
}
...