Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.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 域集合通知和集合视图计数之间的取消同步_Ios_Swift_Uicollectionview_Realm - Fatal编程技术网

Ios 域集合通知和集合视图计数之间的取消同步

Ios 域集合通知和集合视图计数之间的取消同步,ios,swift,uicollectionview,realm,Ios,Swift,Uicollectionview,Realm,我在项目中使用Realm来编写来自API的实时数据,同时填充UICollectionView。为了实现这一点,我一直在使用Realm的集合通知来观察插入。我遇到的问题是,当我在集合视图中使用多个节时,总是会出现以下错误: 由于未捕获异常而终止应用程序 'NSInternalInconsistencyException',原因:'无效更新:无效 第2节中的项目数量。表中包含的项目数 更新4后的现有节数必须等于 更新3之前包含在该节中的项目,加号或减号 从插入的第0节插入或删除的项目数, 0已删除,

我在项目中使用Realm来编写来自API的实时数据,同时填充UICollectionView。为了实现这一点,我一直在使用Realm的集合通知来观察插入。我遇到的问题是,当我在集合视图中使用多个节时,总是会出现以下错误:

由于未捕获异常而终止应用程序 'NSInternalInconsistencyException',原因:'无效更新:无效 第2节中的项目数量。表中包含的项目数 更新4后的现有节数必须等于 更新3之前包含在该节中的项目,加号或减号 从插入的第0节插入或删除的项目数, 0已删除,并加上或减去移入或移出的项目数 第0节搬进来了,第0节搬出去了。”

我在collection视图中有3个部分,每当我从API收到一个新项目时,我都需要刷新这些部分。当我有1个部分时,它工作得很好,但当我有3个部分时,它会导致崩溃。为此,我有一个NotificationToken数组,并观察到新的插入:

内部函数observer结果结果:结果,部分:Int{ notificationTokens.appendresults.addNotificationBlock{[weak self]更改:中的RealmCollectionChange 开关变化{ 案例.首字母: collectionView.reloadData 打破 case.update、let删除、let插入、let修改: collectionView.PerformBatchUpdate{ collectionView.insertItemsat:insertions.map{IndexPathrow:$0,section:section} collectionView.deleteItemsat:deletions.map{IndexPathrow:$0,section:section} collectionView.reloadItemsat:modifications.map{IndexPathrow:$0,section:section} } 打破 case.errorlet错误: fatalError\error 打破 } } } 我在后台队列中写入结果,如下所示:

DispatchQueue.globalqos:.background.async{[weak self]位于 对于索引,在groups.enumerated中分组{ 让结果=项目组:组 如果让realm=try?realm{ 做{ 试试realm.write{ realm.addresult } }catch-let异常{ 无法写入结果:\exception } } } } 这就是我在每个部分中指定项目数量的方式:

func collectionView\uCollectionView:UICollectionView,numberOfItemsInSection:Int->Int{ return resultsleag:section.count//查询表以获取要显示的结果 }
似乎当collection视图在collectionView.PerformBatchUpdate中插入新元素时,有时会同时在database realm.addresult上写入新项,这会导致崩溃,因为在更新的开始和结束之间,项的总数发生了更改。我通过同步写入DispatchQueue.globalqos:.background.sync来避免崩溃,这会导致一些性能问题。我真的很想异步编写任何新项目,但我不明白为什么它会崩溃。是否有人知道发生了什么,以及我如何改进这些内容?

更新需要按照在中定义的顺序应用到您的collectionView。更新案例:先删除,后插入,再修改。因此,PerformBatchUpdate块应如下所示:

collectionView.performBatchUpdates({
  collectionView.deleteItems(at: deletions.map { IndexPath(row: $0, section: section) })
  collectionView.insertItems(at: insertions.map { IndexPath(row: $0, section: section) })
  collectionView.reloadItems(at: modifications.map { IndexPath(row: $0, section: section) })
})

我现在也在努力解决同样的问题。我的最新理论解释了为什么它在一个部分上工作得非常好,而在多个部分上却开始崩溃,如下所示: 集合视图在动画开始时检查部分中的项目数,在动画结束时再次检查,以捕获一致性错误。只要您有一个部分,对结果的更改就会生成一系列通知,每个通知都会启动一个新的PerformBatChUpdate,使所有内容保持完全同步。 当您有多个分区,并且它们自己的通知附加到不同的结果时,您将开始使用交错的通知序列来启动它们自己的PerformButUpdate,更重要的是,在每个动画结束时检查所有分区的计数。
这可能就是为什么你和我会有这些问题。我们每个部分都有单独的通知,但它们的工作会影响整个集合视图部分,包括以前开始的飞行动画和飞行结束检查。我还没有解决这个问题的方法。

你也可以在这篇博文的第三条评论中找到一些可能的解决方法:@nonouf你正在使用哪个版本的领域?我已经尝试了你的答案。看来这没关系,还是有同样的问题