swift - RxSwift map 和 flatMap 的区别

标签 swift rx-swift

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

最佳答案

ma​​p 从流中获取值并返回任何类型的另一个值,结果是 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/

相关文章:

ios - 如何编写 PrimitiveSequence 扩展名包括 <T : Codable>

ios - 如何在根 TableView Controller 中通过 swift 在两个 TableView 之间建立 Segue 连接?

ios - 如何制作通用顶点以便我可以创建具有混合类型的图形(集合)?

ios - 使用硬件键盘时不为 UITextField 调用 shouldChangeText

ios - 为什么 nsurlsession.datataskwithrequst 被取消

swift - CocoaPods RxCocoa 3.6.1 构建在 Xcode 9 中失败

ios - RXSwift 将 View 模型数据绑定(bind)到 View Controller uiimageview

ios - 类型 'inout UIButton' 不符合协议(protocol) 'ReactiveCompatible'

ios - 我正在尝试按位置对用户的帖子进行排序并使用 PFGeopoint 和 Swift 显示距离

ios - SWIFT-IOS : modify a value using NSUserDefaults