我做了示例项目以显示错误。您可以从以下位置克隆或下载:
https://github.com/JakubMazur/SO45820305
尝试对方案SO45820305Testing进行测试。它会崩溃
我的代码负责我的应用中的分页列表。每当新数据出现并进行解析时,它会将数据附加到我的VC中进行建模并插入到UICollectionView
中:
func appendNewData(_ dataSet: [ExampleData]) {
let currentItemsCount = self.collectionViewDataSet.count
self.collectionViewDataSet.append(contentsOf: dataSet)
var paths: [IndexPath] = [IndexPath]()
for i in currentItemsCount...(currentItemsCount+dataSet.count-1) {
paths.append(IndexPath(row: i, section: 0))
}
self.collectionView.performBatchUpdates({
self.collectionView.insertItems(at: paths) /* crash on this line */
}) { _ in
//print("done")
}
}
当应用程序正常启动时,这非常有用。所以我想测试一下这个方法。所以我写了一个简单的测试:
func testAppendNewData() {
self.viewController.collectionViewDataSet = [ExampleData]()
self.viewController.collectionView.reloadData()
let newDataSet = [ExampleData(), ExampleData()]
self.viewController.appendNewData(newDataSet)
...
}
所以这个测试一步一步走:
collectionViewDataSet
中没有数据。对象已初始化但计数器应为0 错误: - [Project.TestClass testAppendNewData] :失败:捕获“NSInternalInconsistencyException”,“无效更新: 第0部分中的项目数无效。包含的项目数 在更新后的现有部分(2)必须等于 更新前该部分中包含的项目数(2),加上 或减去从该部分插入或删除的项目数量(2 插入,0删除)并加上或减去移入的项目数 或超出该部分(0移入,0移出)。“
所以错误说我的计算错误,但实际上must be equal to the number of items contained in that section before the update (2),
打扰了我。这两个项目如何在更新之前结束?有趣的是。它在生产应用程序中如何工作,在测试框架中不起作用?
编辑: @fishinear正确指出,我不应该在不重新加载数据的情况下更改内容,因此我更新了我的代码。现在它就像之上,但仍然导致相同的问题。
答案 0 :(得分:1)
在测试期间,endResetModel()
在customer productlist
xxxx 12345,
yyyy 12345,67891,
zzzz 101112,52693,89563,
aaaa 12536
Expected Results :
customer productlist
xxxx 12345,
aaaa 12536
之前没有调用,这就是崩溃的原因。
解决方案在=IF(COUNTIF($D$5:$D$500,AS10),1,0)
numberOfItemsInSection
答案 1 :(得分:0)
您正在更改数据源的完整内容,而不会告诉集合视图:
self.viewController.collectionViewDataSet = [ExampleData]()
之后你应该调用reloadData
来更新集合视图:
self.viewController.collectionViewDataSet = [ExampleData]()
self.viewController.collectionView.reloadData()
let newDataSet = [ExampleData(), ExampleData()]
self.viewController.appendNewData(newDataSet)