7

我正在将 aviewDidAppearfilterDrivers 与 RxSwift 结合起来。他们工作得很好。但是当我介绍第三个驱动程序时,它停止调用flatMapLatest最新的联合收割机。

在我的视图控制器中,我有这些驱动程序:

let filter: Driver<String>
let viewDidAppear: Driver<Void>
let refresh: Driver<Void>

在我的视图模型中:

// On viewDidAppear, I download a list of portfolios

let viewDidAppearPortfolios = viewDidAppear
    .flatMapLatest({ (_) -> Driver<Result<[PortfolioModel]>> in        
        return networkService.request(Router.portfolios)!
            .responseCollections()
            .trackActivity(fetching)
            .asDriver(onErrorJustReturn: .failure(NSError()))

    })
    .flatMapLatest({ (result: Result<[PortfolioModel]>) -> Driver<[PortfolioModel]> in

        switch result {
        case .success(let value): return Driver.just(value)
        case .failure(_): return Driver.just([])
        }

    })

// Then I combine with a filter from my search bar.

self.portfolios = Driver.combineLatest(viewDidAppearPortfolios, filter)
    .flatMapLatest { (portfolios: [PortfolioModel], filter: String) -> Driver<[PortfolioModel]> in

        if filter.isEmpty {
            return Driver.just(portfolios)
        }

        return Driver.just(portfolios.filter({ (portfolio) -> Bool in
            portfolio.portfolio.localizedCaseInsensitiveContains(filter)
        }))

    }

以上有效!

网络请求一个投资组合列表,我可以在客户端输入时过滤这些结果。

但是,我希望用户拉刷新,并再次触发网络请求!因此,我结合了我的刷新驱动程序。

和这个:

Driver.combineLatest(viewDidAppearPortfolios, filter)

变成这样:

Driver.combineLatest(viewDidAppearPortfolios, filter, refresh)

问题!

与viewDidAppear结合后refresh不再调用!仅当我手动 pullToRefresh 时。flatMapLatest

Driver.combineLatest(viewDidAppearPortfolios, filter, refresh).flatMapLatest { _,_,_ in 
    // No longer get's called on viewDidAppear after combining with refresh
}
  1. 仍然执行,viewDidAppearPortfolios所以网络请求被调用了!
  2. 只有当我手动拉动刷新时,我才能获得我之前请求的投资组合列表......

知道为什么吗?

谢谢!

4

1 回答 1

16

看起来您refresh还没有发出单个事件,因此combineLatest未计算。我试过这段代码来测试:

let one = Driver.just(1)
let two = Driver.just(2)
let three: Driver<Int> = .just(3)

let result = Driver.combineLatest(one, two, three)
    .flatMapLatest {
        return Driver.just($0 + $1 + $2)
    }

result.drive(onNext: {
    print($0)
})

这将打印 6 但如果您使用let three: Driver<Int> = .empty()它,则不会打印任何内容。所以我猜你需要一种方法来设置refresh流的初始值。

于 2017-07-11T17:20:40.133 回答