Ios 使用SWIFT Clean体系结构处理无效的Firebase数据
我试图显示使用此处描述的Swift清洁体系结构从Firebase接收的消息列表: 我的疑问是当firebase中的数据无效时如何处理。当前应用程序崩溃,因为提供给UITableView的索引不正确 我使用的是SWIFT版本的(称为FireBaseQueryDataSource),它为firebase节点提供了正确的索引,如下所示Ios 使用SWIFT Clean体系结构处理无效的Firebase数据,ios,swift,firebase,firebase-realtime-database,clean-architecture,Ios,Swift,Firebase,Firebase Realtime Database,Clean Architecture,我试图显示使用此处描述的Swift清洁体系结构从Firebase接收的消息列表: 我的疑问是当firebase中的数据无效时如何处理。当前应用程序崩溃,因为提供给UITableView的索引不正确 我使用的是SWIFT版本的(称为FireBaseQueryDataSource),它为firebase节点提供了正确的索引,如下所示 private func insertSnapshot(snapshot: FIRDataSnapshot, previousChildKey: String?) {
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)
}
因此,这些索引被传播到UITableView,这可以从以下跟踪中看出:
ChatMessagesViewController.displayMessage(视图模型:ChatMessageViewModel)->()(ChatMessagesViewController.swift:83)
ChatMessagesPresenter.presentChatMessage(响应:ObserveChatMessagesResponse)->()(ChatMessagesPresenter.swift:36)
ChatMessagesInteractor.chatmessagesworkerdiddaddobjectatindex(worker:ChatMessagesWorker,message:FireBaseChatMessage,index:Int)->()(ChatMessagesInteractor.swift:66)
ChatMessagesWorker.dataSourceDidAddObjectAtIndex(数据源:FireBaseQueryDataSource,快照:FIRDataSnapshot,索引:Int)->()(ChatMessagesWorker.swift:131)
FireBaseQueryDataSource.insertSnapshot(快照:FIRDataSnapshot,previousChildKey:String?)->()(FireBaseQueryDataSource.swift:99)
FireBaseQueryDataSource.(observeQuery()->())(闭包#1)(FireBaseQueryDataSource.swift:69)
将FIRDataSnapshot解析为Worker类中的FireBaseChatMessage时,会检测到无效数据,因此不再传播该数据
func dataSourceDidAddObjectAtIndex(dataSource: FireBaseQueryDataSource, snapshot: FIRDataSnapshot, index: Int) {
if let message = FireBaseChatMessage(snapshot: snapshot) {
self.output?.chatMessagesWorkerDidAddObjectAtIndex(worker: self, message: message, index: index)
}
}
问题是以下对象的索引不正确,因此UITableView assertionhandler会引发异常
我不确定我应该在哪里以及如何处理这些指数。Interactor/Worker类没有对节点列表的引用,因此无法在那里获取新索引
在FireBaseQueryDataSource类中,我不能放置任何与此功能相关的逻辑,因为它可以处理任何类型的数据
Presenter或ViewController类不应处理任何逻辑,ChatMessageViewModel应在到达该点时具有正确的索引
如果有任何帮助,我们将不胜感激。在指定索引处传播无效错误如何?这样,您可以在视图部件上删除它,索引保持一致。在指定索引处传播无效错误如何?这样,您可以在视图部分删除它,索引保持一致。谢谢您,Mijail,我认为这是一个可能的解决方案。在视图级别上,我们决定显示一个或另一个数据是完全可行的。但我怀疑它实际上不会是视图级别的业务逻辑,这可能不应该发生。我想这取决于业务逻辑是如何定义的。无论如何,最后我决定忽略错误,不传播无效数据,放弃worker中的给定消息,并基于时间戳值重新计算视图级别的索引,而不是依赖从firebase接收的索引。我仍然接受你的解决方案。谢谢你,米贾尔,我认为这是一个可能的解决办法。在视图级别上,我们决定显示一个或另一个数据是完全可行的。但我怀疑它实际上不会是视图级别的业务逻辑,这可能不应该发生。我想这取决于业务逻辑是如何定义的。无论如何,最后我决定忽略错误,不传播无效数据,放弃worker中的给定消息,并基于时间戳值重新计算视图级别的索引,而不是依赖从firebase接收的索引。我仍然接受你的解决方案。谢谢