一尘不染

RxSwift地图和flatMap的区别

swift

我无法理解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)

阅读 459

收藏
2020-07-07

共1个答案

一尘不染

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元素本身都可以发出值,因为它们本身是流。

2020-07-07