我无法理解 RxSwift 中 map 和 flatMap 的区别。在 RxSwift Playground 示例和书籍中,flatMap 被用作转换具有内部 Observable 属性的 Observable。
但是我看到 flatMap 被直接用在基本类型的 Observable 上。例如对于下面的代码,它们都产生相同的输出。谁能帮我理解 map 和 flatMap 之间的区别
struct Student {
let score:Int
}
let ryan = Student(score:80)
let student = PublishSubject<Student>()
let deneme = student.map({ val in
return Student(score: val.score+10)
})
deneme.subscribe(onNext: {
print("StudentMAP: \($0.score)")
})
let deneme2 = student.flatMap({ val -> Observable<Student> in
return Observable.of(Student(score: val.score + 10))
})
deneme2.subscribe(onNext: {
print("StudentFlatMAP: \($0.score)")
})
student.onNext(ryan)
最佳答案
map 从流中获取值并返回任何类型的另一个值,结果是 Observable< whatever type >。
flatMap 从流中获取值并返回任何类型的 Observable。
这意味着您可以在以下情况下使用flatMap:
您已经声明了一个返回 Observable< 的函数? >,所以你可能想在 flatMap 中使用它
func foo(_ number: Int) -> Observable<String> { return Observable.just(String(number)) } Observable.just(1) .flatMap { (number) -> Observable<String> in return foo(number) }
您需要返回值在流中推送多个值
func updates() -> Observable<String> { // Something that generates updates } func shouldListenToUpdated() -> Observable<Bool> { return Observable.just(true) } shouldListenToUpdated() .flatMap { (listenToUpdated) -> Observable<String> in return listenToUpdated ? updates() : Observable.empty() }
虽然 map 只会转换流中的下一个值。
希望这能澄清一些事情。
关于swift - RxSwift map 和 flatMap 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49627902/