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)

回答:

flatMapmap 相似,但是它将可观察的元素转换为可观察的序列。您使用的示例相对简单,只是将发送和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

回到顶部