Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用SWIFT Clean体系结构处理无效的Firebase数据_Ios_Swift_Firebase_Firebase Realtime Database_Clean Architecture - Fatal编程技术网

Ios 使用SWIFT Clean体系结构处理无效的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?) {

我试图显示使用此处描述的Swift清洁体系结构从Firebase接收的消息列表:

我的疑问是当firebase中的数据无效时如何处理。当前应用程序崩溃,因为提供给UITableView的索引不正确

我使用的是SWIFT版本的(称为FireBaseQueryDataSource),它为firebase节点提供了正确的索引,如下所示

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接收的索引。我仍然接受你的解决方案。谢谢