RxSwift:如何使用其他两个可观察对象(其中一个依赖另一个)创建一个可观察对象?

问题描述 投票:0回答:1

我是 RxSwift 的新手,刚刚继承了一个旧的代码库(没有原始开发人员在场)。我试图不对架构(MVVM)进行许多/任何调整。

在代码中,每个视图控制器都有一个视图模型,每个视图模型都公开视图控制器可用于更新其 UI 的 Rx 驱动程序(下面的通用驱动程序示例):

lazy var imageToDisplay: Driver<UIImage?> = {
        Observable.combineLatest(observableAPICall1(), observableAPICall2())
            .map { [unowned self] payload1, payload2 in
                if payload1 == nil || payload2 == nil {
                    return UIImage(named: "default")!
                } else {
                    return payload1.image
                }
            }
            .asDriver(onErrorJustReturn: nil)
}()

在视图模型驱动程序代码中,我们通过返回可观察值的方法进行 API 调用(例如:上面看到的

observableAPICall1()
)。

对于我当前的任务,我添加了一个新的 API 调用,该调用需要用户的一些信息才能调用(假设 API 调用是

getGiftIdeasForUser(givenBirthday: Date)
,所需的信息是用户的生日)。

现在,这是我正在努力解决的部分:API 调用和用户的个人资料(存储生日的对象)都是可观察的。那么,我如何构建我的代码/API 调用以确保在进行所述 API 调用之前了解用户的生日?

换句话说,有没有一种方法可以链接事物,以便我首先获得可观察的用户个人资料,然后再点击

getGiftIdeasForUser()
可观察的API?

如果我以错误的方式思考这个问题,请提前道歉……仍然把我的注意力集中在 Rx 上。谢谢。

ios swift observable rx-swift
1个回答
0
投票

最基本的解决方案是这样的:

struct User {
    let birthday: Date
}
struct GiftIdea { }

func example(userProfile: Observable<User>, getGiftIdeasForUser: @escaping (Date) -> Observable<[GiftIdea]>) -> Observable<[GiftIdea]> {

    userProfile
        .map { $0.birthday }
        .flatMap { getGiftIdeasForUser($0) }

}

但是,有多种不同的

flatMap
函数,您应该使用哪个函数取决于您未提供的上下文。这里有一篇文章解释了不同的
flatMap
运算符以及在什么上下文中使用它们:RxSwift's Many Faces of FlatMap

© www.soinside.com 2019 - 2024. All rights reserved.