viewDidDisppear导致错误后的performBatchUpdates?

时间:2016-05-05 14:44:13

标签: ios uicollectionview ios9

我正在打电话

performBatchUpdates({
            self.insertItemsAtIndexPaths(indexPathes)
            },
            completion: {
                _ in
        })

在控制器中看不到的集合视图上!已有另一个视图控制器推到它上面。

这会导致以下错误:

Invalid update: invalid number of items in section 0.  The number of items contained in an existing section after the update (12) must be equal to the number of items contained in that section before the update (12), plus or minus the number of items inserted or deleted from that section (12 inserted, 0 deleted) and plus or minus the number of items moved into or out of that section (0 moved in, 0 moved out).'

但这根本不是真的,因为如果我在视图可见时调用performBatchUpdates,它将完美无缺。

究竟发生了什么?

编辑: 请注意,如果我调用reloadData,它在视图不可见时工作正常。苹果对此有何评论?

我怎样才能抓住这个例外。所以我可以改为使用reloadData吗?

编辑: 我在调用performBachUpdates之前打印了以下内容:

print("visibleCells().count :"  + String(self.visibleCells().count))
print("dataModel count:" + String(self.dataArray.count))

这是我得到的:

visibleCells().count :0
dataModel count:12

这意味着异常不正确!!

1 个答案:

答案 0 :(得分:1)

正如@rmaddy在评论中提到的,您的问题是您没有正确更新数据模型 您为insertItemsAtIndexPaths(包含12个索引)调用indexPathes,但您的数据模型以12个索引开始,在批量更新后以12个索引结束。您只需在数据模型中插入内容时调用insert(例如,在调用与dataModel.insert("whatever", atIndex: 0)类似的内容后,您也可以使用索引0调用insertItemsAtIndexPaths。) 这似乎不是这种情况,因为你最终会得到相同数量的元素(12)。在这种情况下,如果要刷新集合视图,则需要调用reloadData(如果数据没有更改,则不要调用任何内容)

reloadData不会抛出此类异常,因为它不会添加/删除任何内容,它只会获取您在数据源中提供的任何内容。 insertItemsAtIndexPaths可以为更改设置动画,因此它会进行一些检查,以查看您的数据模型(无论您在数据源中提供的是什么)添加了新元素,否则会抛出异常。
捕获异常(使用@ try / catch)不会让你走得太远,因为它会使更新处于某种奇怪的状态,从而导致进一步的问题。