2017-07-03 1 views
1

J'utilise la dernière version de Moya avec RxSwift et j'ai rencontré un problème logique pour lequel je ne trouve pas de solution, pour le moment.Renouveler la demande dans RxMoya

Disons que j'ai un UITableViewController avec un ViewModel qui implémente l'interface suivante:

protocol ListViewModelType { 

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

} 

La propriété items est mis en œuvre (en utilisant EVReflection):

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

Dans la méthode viewDidLoad de UITableViewController, j'ai mis en place une liaison entre la propriété items et la tableView via le code suivant:

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

Maintenant, je voudrais actualiser le contenu de UITableView pour refléter les changements que l'utilisateur a fait à travers d'autres parties de l'application. Considérant que RxMoyaProvider renvoie un Observable, cela devrait être facilement fait par une autre valeur émise par l'Observable, mais je ne sais pas comment communiquer au fournisseur qu'il devrait rafraîchir le contenu du serveur et le mettre dans le même Observable.

Ai-je oublié quelque chose ici? Existe-t-il une méthode plus recommandée pour lier un UITableView à une liste d'objets provenant d'un RxMoyaProvider?

Répondre

1

Vous devez recharger notre demande Moya. C'est un peu hacky mais je suppose que vous obtenez l'indice.

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

Sinon, vous pouvez remodeler notre architecture avec un principe hors ligne premier

enter image description here

+0

Ok, je vois votre point sur le hors-premier principe, mais à l'heure actuelle est en dehors des exigences et je Je préfère rester en ligne seulement. La méthode que vous proposez ressemble beaucoup à un hack ... Etes-vous sûr qu'il n'y a aucun moyen de l'implémenter en utilisant quelque chose d'autre, comme un wrapper pour un MoyaProvider, peut-être? – MrAsterisco

+0

Je ne vois vraiment pas l'intérêt de le faire. Sans le premier hors ligne –

+0

Eh bien, le point serait de soutenir les situations où la réponse du serveur pourrait changer au fil du temps. Observables sont décrits comme des flux de données et, à mon humble avis, c'est exactement ce que j'ai ici: un flux de données qui émet une nouvelle valeur chaque fois que je lui demande de rafraîchir. – MrAsterisco