2017-01-29 5 views
0

J'essaie de trouver un moyen de faire ce qui suit: lorsque mon application s'ouvre, il va charger une vue de grille de données en souscrivant à ma couche de données observable. Ce que j'essaie de comprendre est comment je peux faire une sorte de mutation de données à cette vue de la grille, comme cacher un élément de la grille quand un utilisateur clique sur le bouton caché, ou trier les éléments .. puis avoir la couche de données envoyer le mise à jour des données à n'importe quelle liste. Mon but est que je veux que n'importe quelle classe soit capable de faire cette manipulation et que cette nouvelle mise à jour de données se propage à tous les ConnectableObservers. Donc, idéalement, je pourrais juste appeler un cas d'utilisation dans ma couche de domaine, et avoir cette poignée en sauvegardant les données dans ma couche de données, puis j'appellerais tous les écouteurs avec mes nouvelles données mises à jour.Comment puis-je déclencher un modèle pour donner de nouvelles données lors d'une sauvegarde

Le problème que je rencontre est que je n'arrive pas à penser à un moyen d'appelerNext de mes couches de données observables sans réabonnement.

est ici un code pseudo explication de ce que je veux dans ma couche de domaine:

gridRepository.hidElement(someId).onCompleteDo({action -> gridRepository.getGridData()}) 

gridRepository est juste une interface à ma couche de données et hideElement() doivent retourner un Observable.

Cela devrait alors déclencher le suivant sur mon abonné de couches de présentation, donc ma vue de grille se met à jour avec les données nouvellement modifiées. Mon objectif sous-jacent est de retirer cette logique d'une implémentation de bus d'événement dans ma couche de présentation et d'avoir cette logique dans mon domaine, car je peux envahir certains de ces états de données en affectant d'autres couches que la présentation , il serait donc utile d'avoir un lieu d'expédition central pour ces événements.

Side Note: Je construit mon application hors de cette structure de projets, parce que je pense qu'il a une élégance à elle, mais elle ne résout pas tout la façon dont je voudrais que ce. : https://github.com/android10/Android-CleanArchitecture

Toute aide avec ceci ou suggestions serait grandement appréciée.

Répondre

0

J'ai décidé de résoudre ce problème avec un sujet de publication utilisé comme bus d'événements. Il est injecté dans plusieurs classes.

return bookRepository.getLibrary() 
     .repeatWhen(e -> eventBus.toObservable() 
       .filter(event -> event.equals(LIBRARY_CHANGED))); 

mon bus d'événement est juste un publier sujet avec une classe wrapper:

public class EventBus { 

    private final PublishSubject<Object> _bus = PublishSubject.create(); 

    public void post(Object event) { 
     _bus.onNext(event); 
    } 

    public Observable<Object> toObservable() { 
     return _bus; 
    } 
} 

donc alors sur un événement qui devrait mettre à jour ma bibliothèque, je fais ceci:

repository.searchLibrary(params.searchTerm) 
    .doOnComplete(() -> eventBus.post(LIBRARY_CHANGED)); 

cette volonté déclencher ma bibliothèque pour être appelée à nouveau. LIBRARY_CHANGED est juste un élément Enum.