我无法理解RxSwift中map和flatMap之间的区别。在RxSwift游乐场示例和书籍中,flatMap用作转换具有内部Observable属性的Observables。
但是我看到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)
flatMap 与 map 相似,但是它将可观察的元素转换为可观察的序列。您使用的示例相对简单,只是将发送和Observable映射到其他示例中。
这是来自Reactive扩展文档的报价,
FlatMap运算符通过将您指定的函数应用于源Observable发出的每个项目来转换Observable,该函数返回一个本身发出项目的Observable。然后,FlatMap合并这些生成的Observable的发射,将这些合并的结果作为自己的序列发射。 例如,当您有一个Observable发出一系列本身具有Observable成员的项目或可以以其他方式转换为Observable的项目时,此方法很有用,这样您就可以创建一个新的Observable来发出由Observable发出的项目的完整集合这些项目的子可观测项。
FlatMap运算符通过将您指定的函数应用于源Observable发出的每个项目来转换Observable,该函数返回一个本身发出项目的Observable。然后,FlatMap合并这些生成的Observable的发射,将这些合并的结果作为自己的序列发射。
例如,当您有一个Observable发出一系列本身具有Observable成员的项目或可以以其他方式转换为Observable的项目时,此方法很有用,这样您就可以创建一个新的Observable来发出由Observable发出的项目的完整集合这些项目的子可观测项。
如果稍微扩展一下示例,您将知道 flatMap 实际上将每个元素转换为一个序列。
请注意,您曾经使用过,
student.onNext(ryan)
删除您的dename2并在下面添加此代码,
let studentObservable: PublishSubject<Student> = PublishSubject() let deneme2 = student.flatMap({ val -> Observable<Student> in return studentObservable.map { val in Student(score: val.score + 10) } }) deneme2.subscribe(onNext: { print("StudentFlatMAP: \($0.score)") }) student.onNext(ryan) studentObservable.onNext(Student(score: 80)) studentObservable.onNext(Student(score: 90)) studentObservable.onNext(Student(score: 100))
现在,您可以看到 map 会简单地从序列中转换一个值并创建新的 Observable ,而 flatMap 会将其转换为序列。现在,每个flatMapped元素本身都可以发出值,因为它们本身是流。