Оператор
map
используется для преобразования значения и передачи преобразованного значения следующему оператору, где flatmap
выравнивает иерархию наблюдаемых и представляет ее как единственный оператор
Вариант использования для map
и flatmap
Обычно вы используете map
, если хотите преобразовать значение, полученное в текущем операторе, и передать его следующему оператору, как правило, синхронно.Например, в вашем случае, независимо от того, какое значение присвоено BehaviorRelay
String
, вы хотите вернуть "hhh", что является прямым синхронным преобразованием значения, поэтому map
имеет смысл
string
.map { _ in "hhh" }
.subscribe(onNext: { element in
print(element)
}, onCompleted: {
print("completed")
}
)
flatmap
сгладить иерархию наблюдаемых и представить ее следующему оператору просто как одну наблюдаемую.Пример Предположим, что вы реализуете поиск, после того как значение сработало, вы хотите сделать вызов API и передать ответ следующему оператору.Теперь выполнение API-вызова является асинхронной операцией, и вы знаете, что простой map
не будет проходить через него, тогда вы можете использовать flatmap
let string = BehaviorRelay<String>(value: "abcd")
string
.flatMap { s -> Observable<Response> in
return Observable<Response>.create({ (observer) -> Disposable in
//make api call here
//pass data / error using observer.onNext or observer.onError()
return Disposables.create()
})
}
.subscribe(onNext: { element in
print(element)
}, onCompleted: {
print("completed")
}
)
Так что здесь фактический API-вызов выполняется наблюдаемым внутри flatMap
оператор, но для внешнего мира похоже, что BehaviorRelay сам преобразовал значение типа string в Response.
Это прекрасно, потому что не нужно знать все мелочи, связанные с вызовом API :)
Но, если честно, если вы действительно осуществляете поиск, вы бы предпочли flatMapLatest
а не flatmap
.Читайте больше на flatMap
и flatMapLatest
для лучшего понимания :)