Проблема в том, как написана ваша функция getObjectStatus
. По-видимому, он возвращает .just
или некоторую другую наблюдаемую величину, которая фактически не повторяет сетевой вызов. Не видя этот код, я не могу дать однозначного ответа.
Однако обратите внимание:
func getObjectStatus(someObject: Int) -> Observable<SomeObject> {
var count = 0
return Observable.create { observer in
print("called getObjectStatus")
if count < 3 {
observer.onNext(SomeObject(status: .notProcessed))
observer.onCompleted()
count += 1
}
else {
observer.onNext(SomeObject(status: .processed))
observer.onCompleted()
}
return Disposables.create()
}
}
Использование вышеприведенного с вашей цепью приведет к тому, что "selectedObjectStatus" будет напечатан 3 раза.
В то время как:
var count = 0
func getObjectStatus(someObject: Int) -> Observable<SomeObject> {
print("called getObjectStatus")
if count < 3 {
count += 1
return Observable.just(SomeObject(status: .notProcessed))
}
else {
return Observable.just(SomeObject(status: .processed))
}
}
Не будет.
Разница здесь в том, что в последнем случае .just(SomeObject(status: .notProcessed))
- это то, на что подписывается подписка, поэтому он каждый раз возвращает одно и то же.
Закрытие вызова в flatMap работает, потому что это .just(Void())
, на который повторно подписывается, что означает, что содержимое flatMap вызывается снова.