2017-02-17 2 views
1

Je suis en train de montrer une liste de messages reçus de Firebase en utilisant l'architecture propre Swift décrit ici:Traitement des données Firebase invalides avec SWIFT propre architecture

http://clean-swift.com/clean-swift-ios-architecture/

Mon doute est de savoir comment gérer lorsqu'une donnée est invalide dans Firebase. Actuellement, l'application se bloque car l'index fourni à UITableView est incorrect.

J'utilise une version SWIFT du FUArray class (appelé FireBaseQueryDataSource) qui fournit l'indice pour les noeuds Firebase correctement, comme suit

private func insertSnapshot(snapshot: FIRDataSnapshot, previousChildKey: String?) { 
    var index = 0 
    if let previousChildKey = previousChildKey { 
     index = self.index(key: previousChildKey) + 1 
    } 

    self.snapshots.insert(snapshot, at: index) 
    self.delegate?.dataSourceDidAddObjectAtIndex(dataSource: self, snapshot: snapshot, index: index) 
} 

Ainsi, ces indices sont propagées à l'UITableView comme il peut être apprécié à partir de la trace suivante:

ChatMessagesViewController.displayMessage (viewmodel: ChatMessageViewModel) ->() (ChatMessagesViewController.swift: 83)

ChatMessagesPresenter.presentChatMessage (réponse: ObserveChatMessagesResponse) ->() (ChatMessagesPresenter.swift: 36)

ChatMessagesInteractor.chatMessagesWorkerDidAddObjectAtIndex (travailleur: ChatMessagesWorker, message: FireBaseChatMessage, index: int) ->() (ChatMessagesInteractor.swift: 66)

ChatMessagesWorker.dataSourceDidAddObjectAtIndex (dataSource: FireBaseQueryDataSource, instantané: FIRDataSnapshot, index: int) ->() (ChatMessagesWorker.swift: 131)

FireBaseQueryDataSource.insertSnapshot (instantané: FIRDataSnapshot, previousChildKey: String) - >() (FireBaseQueryDataSource.swift: 99)

FireBaseQueryDataSource (observeQuery() ->()) (FireBaseQueryDataSource.swift: 69) (fermeture # 1).

Lorsque FIRDataSnapshot est analysé à FireBaseChatMessage dans la catégorie des travailleurs les données non valide est détectée de manière. il n'est plus propagé.

func dataSourceDidAddObjectAtIndex(dataSource: FireBaseQueryDataSource, snapshot: FIRDataSnapshot, index: Int) { 
    if let message = FireBaseChatMessage(snapshot: snapshot) { 
     self.output?.chatMessagesWorkerDidAddObjectAtIndex(worker: self, message: message, index: index) 
    } 
} 

La chose est que les objets suivants sont incorrects avec des index afin UITableView assertionhandler déclenche une exception.

Je ne sais pas où et comment devrais-je gérer les indices. La classe Interactor/Worker n'a pas de référence à la liste des nœuds, de sorte que je ne peux pas y trouver de nouveaux index.

Dans la classe FireBaseQueryDataSource, je ne peux pas mettre de logique liée à cette fonctionnalité car elle peut gérer n'importe quel type de données.

Les classes Presenter ou ViewController ne doivent pas gérer de logique, ChatMessageViewModel doit déjà avoir les index corrects lorsqu'elles arrivent à ce point.

Toute aide serait appréciée. Qu'en est-il de la propagation de l'erreur non valide à l'index spécifié?

Répondre

0

De cette façon, vous pouvez le supprimer sur la partie vue et les indices rester cohérents.

+1

Merci Mijail, je pense que c'est une solution possible. Il serait tout à fait possible qu'au niveau de la vue, nous décidions de montrer une donnée ou autre. Mais j'ai le doute que ce ne serait pas vraiment la logique métier au niveau de la vue, ce qui ne devrait probablement pas arriver. Je suppose que cela dépend de la façon dont la logique métier est définie. Enfin, j'ai décidé de ne pas tenir compte de l'erreur, de ne pas propager de données incorrectes, de supprimer le message donné dans worker et de recomposer les index au niveau de la vue en fonction des valeurs d'horodatage. J'accepte toujours votre solution. Merci – Yunnyyy