RxSwift: цепь, дополняемая до наблюдаемой - PullRequest
0 голосов
/ 08 июня 2018

Я бы хотел связать завершаемый элемент с наблюдаемым элементом.После вызова flatMap обратные вызовы onCompleted и onError, по-видимому, не вызываются при подписке.

var user = PublishRelay<User>()

func fetchUserInformation(_ userId: String) -> Completable {
    return Completable.create { observer in
        apiService.fetchInformation(for: userId, completion: { response in
            if let name = response?.name {
                user.accept(User(name: name))
                observer(.completed)
            } else {
                observer(.error(ServiceError.userInformation))
            }
        })
        return Disposables.create()
    }
}

login()
.flatMap{ userId in fetchUserInformation(userId) }
.subscribe(
    onCompleted: {
        print("Success!") // Not being called at all
    },
    onError: { error in
        print(error)  // Not being called at all
    }
).disposed(by: disposeBag)

Хотя fetchUserInformation и наблюдатель (.completed) вызывается и пользовательская информация успешно выбирается, я не смогу поймать onCompleted при подписке (только если ему предшествует flatMap ).

Есть ли чистый способ добиться этого?

Уже пробовали .materialized () сразу после вызова flatMap , чтобы получить

    Observable<Event<Never>>

вместо

    Observable<Never>

Это тоже не работает.

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Я думаю, что вы можете сделать что-то вроде этого:

login()
    .flatMap{ userId -> Observable<Void> in
        return fetchUserInformation(userId).andThen(.just(Void()))
    }.subscribe(onNext: { _ in
        ...
    }).disposed(by: disposeBag)
0 голосов
/ 20 сентября 2018

Правильным решением было бы использование оператора 'andThen'.

someCompletable
   .andThen(someObservable) 

Редактировать : просто прочитайте остальную часть вашего кода - я не уверен, почему вы используете Completable вообще, так как кажется, что вы на самом деле возвращаете какой-то элемент из этого потока.

Вы, вероятно, захотите использовать наблюдаемую Single или Plain-ol 'для передачи этого значения без использования внешнего реле.

0 голосов
/ 08 июня 2018

Насколько я знаю, вы не можете преобразовать Completable в Observable, так как в последнем случае значения пропускаются, а в Completable - нет.

Я полагаю, что flatMap возвращает Observables из Login, а затем вы конвертируете ее в Completables, и поэтому она не работает

...