2017-07-03 149 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