2017-07-03 105 views
1

我在RxSwift中使用最新版本的Moya,而且我遇到了一个逻辑问题,目前我找不到解决方案。RxMoya中的重复请求

比方说,我有一个实现了以下接口视图模型一个UITableViewController:

protocol ListViewModelType { 

    var items: Observable<[Item]> { get } 

} 

items属性被实现为(使用EVReflection):

var items: Observable<[Therapy]> { 
     get { 
      let provider = RxMoyaProvider<ItemService>() 
      return provider 
       .request(.all) 
       .map(toArray: Item.self) 
     } 
    } 

在viewDidLoad方法在UITableViewController中,我已经通过以下代码建立了项目属性和tableView之间的绑定:

self.viewModel.items 
      .bind(to: tableView.rx.items(cellIdentifier: cellIdentifier, cellType: cellType)) { row, element, cell in 
       // cell configuration code 
      } 
      .disposed(by: self.disposeBag) 

现在,我想刷新UITableView的内容以反映用户通过应用程序的其他部分完成的更改。考虑到RxMoyaProvider返回一个Observable,这应该很容易通过Observable发出的另一个值完成,但我不知道如何与提供者通信,它应该刷新服务器的内容并将其放入相同的Observable中。

我失去了一些东西在这里?有没有更好的方法将UITableView绑定到来自RxMoyaProvider的对象列表?

回答

1

您必须重新加载我们的Moya请求。这有点冒险,但我想你会得到提示。

let didAppear = Variable(true) 
override func viewDidAppear(_ animated: Bool) { 
    didAppear.value = true 
} 

override func viewDidLoad(){ 
    self.didAppear.flatMap{ _ in self.viewModel.items} 
     .bind(to: tableView.rx.items(cellIdentifier: cellIdentifier, cellType: cellType)) { row, element, cell in 
      // cell configuration code 
     } 
     .disposed(by: self.disposeBag) 
} 

或者你可以重新设计我们的架构与下线为先的原则

enter image description here

+0

好吧,我看到你的下线为先的原则点,但目前是要求和我之外更喜欢坚持在线。你提出的方法看起来很像一个黑客...你确定没有办法使用其他的东西来实现这个,比如MoyaProvider的包装器,也许吧? – MrAsterisco

+0

我真的不明白这一点。没有首先脱机 –

+0

好的,重点是支持服务器的答案可能随时间而改变的情况。可观察物被描述为数据流和恕我直言,这正是我在这里所得到的:一个数据流,每当我要求它刷新时就会发出一个新值。 – MrAsterisco