PromiseKit 是不是有 RxSwift Zip 替代方案?

Posted

技术标签:

【中文标题】PromiseKit 是不是有 RxSwift Zip 替代方案?【英文标题】:Does PromiseKit have an RxSwift Zip alternative?PromiseKit 是否有 RxSwift Zip 替代方案? 【发布时间】:2019-03-20 08:33:11 【问题描述】:

我目前正在处理一个需要重构 RxSwift 依赖项以引入 PromiseKit 的项目。

我对@9​​87654323@ 或PromiseKit 不是很熟悉,所以如果这是显而易见的,请原谅我。

我仍在寻找一种方法来处理 Zip 用例

override func start() -> Observable<CoordinationResult> 

    let tabBarController = UITabBarController()
    let tabs: [SectionTab] = [.feed]
    let coordinationResults = Observable.from(configure(tabBarController: tabBarController, withTabs: tabs)).merge()

    window.rootViewController = tabBarController
    window.makeKeyAndVisible()

    return coordinationResults
        .take(1)


private func configure(tabBarController: UITabBarController, withTabs tabs: [SectionTab]) -> [Observable<Void>] 
    let navControllers = tabs
        .map  tab -> UINavigationController in
            let navController = BaseNavigationController()
            navController.tabBarItem = UITabBarItem(title: tab.title, image: nil, selectedImage: nil)
            return navController
    

    tabBarController.viewControllers = navControllers
    tabBarController.view.backgroundColor = UIColor.white // Fix dark shadow in nav bar on segue

    return zip(tabs, navControllers)
        .map  (tab, navController) in
            switch tab 
            case .feed:
                let coordinator = FeedCoordinator(navigationController: navController, dependencies: dependencies)
                return coordinate(to: coordinator)
            
    

据我了解,Zip 结合了 2 个 Observable,并允许您对它们进行操作,发出一个 observable,这基本上是 2 个原始 observable 和您的操作的结果。

【问题讨论】:

【参考方案1】:

首先,您的 sn-p 代码包括 Apple 的 Swift zip,它与反应式编程和 RxSwift 无关。https://developer.apple.com/documentation/swift/1541125-zip

在您的情况下,它只是将两个数组 tabsnavControllers 组合在一起。

您对反应式 Zip 运算符的理解有点过于简化了更复杂的情况,即压缩具有多个发射值的流。 如有疑问,请务必检查弹珠图: http://reactivex.io/documentation/operators/zip.html

因此你最初的直觉理解更符合CombineLatest http://reactivex.io/documentation/operators/combinelatest.html

对于您的原始问题,无论包含的代码如何 - 假设您在 ZipCombineLatest 两个流具有一个发射值的超级简化场景中,您可以在 PromiseKitwhen(resolved: guarantees).done 中实现类似的效果

【讨论】:

以上是关于PromiseKit 是不是有 RxSwift Zip 替代方案?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PromiseKit 和 Alamofire 时跟踪进度

PromiseKit 3 for Swift2 中的“when”是不是已重命名?

PromiseKit 首先围绕代码,而不是函数调用

PromiseKit O-C 指南

isKindOfClass 在 PromiseKit 中返回 nil 吗?

如何检查 RXSwift 中的 observable 是不是为空?