我是 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 上。谢谢。
最基本的解决方案是这样的:
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