10

在处理UICollectionView我的应用程序中的 a 时,我遇到了一个与重新加载数据相关的奇怪问题。经过大量调试和分析日志后,我得出的结论是,如果reloadData紧随其后,肯定insertItemsAtIndexPaths会发生以下可怕的错误:

名称:NSInternalInconsistencyException原因:无效更新:第 0 节中的项目数无效。更新后现有节中包含的项目数 (1) 必须等于更新前该节中包含的项目数 (1),加上或减去从该部分插入或删除的项目数(1 个插入)...

他们唯一能让这种情况持续发生的方法是,当呼叫到达时,内部UICollectionView仍然很忙。" " 在完成之前连续调用两次的事实似乎支持了这一点,因为在调用其他情况下,该方法从不连续调用两次。reloadDatainsertItemsAtIndexPathscollectionView:numberOfItemsInSectioninsertItemsAtIndexPaths

有没有人看到过类似的行为,或者可以确认我的分析,甚至提出适当的解决方法?

更新:是的,我确保所有相关调用都发生在主线程上。

更新 2:由于出现这种情况的原因一直受到质疑:我正在使用 Monotouch 并且有问题的代码旨在保持通用 .Net Collections将此事件触发到适当的调用中,以保持 UICollectionView 绑定到集合同步中。当源集合被清除时,它会响应重置操作,然后在将项目插入其中时执行一个或多个添加操作,这会导致上述问题。希望这可以帮助。

4

1 回答 1

1

当您调用insertItemsAtIndexPaths(removeItemsAtIndexPaths类似) 时,您是在告诉您的 collectionview 它的数据源现在有更多可用项目,并且它应该在您指定的索引路径中插入这些可用项目。

它会检查您的数据源该语句是否为真,如果它检测到旧项目的数量加上您说您插入的项目数量不等于新项目的数量,它表示它无法进行更新,因为你谎报你改变了多少项目。

现在,您正在做的是告诉您的 collectionview 应该从其数据源(使用新数据)重新加载其所有数据,然后立即告诉它您插入了 x 个项目。这是一个错误的陈述,因为您刚刚重新加载了 collectionview,它更新了它的项目数量,因此更新之前的项目数量等于更新之后的项目数量(你没有做任何事情),而不是增加了您指定的索引路径的数量。

我希望你还在我身边,因为这是你的解决方案:

删除reloadData之前的insertItemsAtIndexPaths,因为这会破坏它的断言并且在错误使用时会抛出异常。如果您想在插入项目之前重新加载集合视图,请确保insertItemsAtIndexPaths在更改数据源中的项目后立即执行。

在此处阅读此方法的文档。

于 2015-12-01T22:29:29.573 回答