RxSwift地图和flatMap的区别
我无法理解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 实际上将每个元素转换为一个序列。
请注意,您曾经使用过,
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元素本身都可以发出值,因为它们本身是流。
以上是 RxSwift地图和flatMap的区别 的全部内容, 来源链接: utcz.com/qa/414355.html