2017-07-11 40 views
1

我将viewDidAppearfilter驱动程序与RxSwift结合在一起。他们工作得很好。但是,当我介绍第三个驱动程序时,它会停止在最新的组合程序上调用flatMapLatest如何正确组合多个驱动程序与RxSwift?

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

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) 
     })) 

    } 

上述作品!

网络请求组合列表,并我能够为我打字,客户端过滤这些结果。

不过,我想为用户拉刷新,并TRIGER网络再次请求!所以,我与我的刷新驱动程序结合起来。

这:

Driver.combineLatest(viewDidAppearPortfolios, filter) 

变为这样:

Driver.combineLatest(viewDidAppearPortfolios, filter, refresh) 

问题!

refreshflatMapLatest合并后不再呼吁viewDidAppear!只有当我手动pullToRefresh。

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

任何想法,为什么?

谢谢!

回答

4

看起来您的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流。

+1

就是这样,谢谢。在我的例子中,我添加了'startWith'到我的refreshControl:'refreshControl.rx.controlEvent(.valueChanged).startWith(())。asDriver(onErrorJustReturn:())' – nmdias

相关问题