我正在使用一个显示对象数组的 CollectionView。 单击一个按钮,我用一组新数据填充这个数组。 我想用这些数据刷新 CollectionView。 有没有什么声明可以更新这个而不是比较每个项目并有选择地删除和添加? reloadData 通常以以下错误结束。
CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION
简而言之,我正在寻找以下步骤...... 1)填充数据源数组,显示数据。 2) 用新数据填充数据源数组,刷新 CollectionView 以显示数据。
提前致谢
最佳答案
尝试 - (void)performBatchUpdates:(void (^)(void))updates completion:(void (^)(BOOL finished))completion
。
在你的情况下,你想要“一组全新的数据”,可以这么说,例如:
[myCV performBatchUpdates:^{
// one of:
// a)
[myCV deleteSection:someIndexSetForTheEntireSection];
[myRealDataSource empty:someIndexSetForTheEntireSection];
//
// OR b)
[myCV deleteItemsAtIndexPaths:someSetOfIndexPaths];
[myRealDataSource removeIndexPaths:someSetOfIndexPaths];
// Either case:
NSArray *indexPaths = [myRealDataSource getNewDataAndReturnIndexPaths];
// if a)
[myCV insertSections:newIndexSetForNewSection];
// Either case:
[myCV insertItemsAtIndexPaths:newIndexSetForInsertions];
}
completion:^(BOOL finished) {
NSLog(@"Done.");
// Maybe signal something else if you want.
}];
performBatchUpdates:completion:
将期望原始数据源检查中的删除和插入进入函数,以添加到离开方法的正确数据源大小。否则它会大声提示。
如果您只有一个部分(第 0 部分),如果您总是“删除所有内容”并“插入一个完整的新集”,则可以比特定索引路径更通用。
使用 KVO 监听数据源的插入和删除的另一种选择,只需 reloadData
、reloadItemsAtIndexPaths:
或 reloadSections:
作为合适的。
我更喜欢响应式(Reactive) KVO 版本,因为我倾向于使用 Core Data 的 Collection View ,而不是伪静态或内存中的 NSArray。
为了找出 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION 问题,我会在所有异常上设置一个断点,并尝试找出真正触发问题的原因。可能您的数据源已不存在,并且当您尝试从中读取/写入时出现错误访问。
关于ios - UICollectionView 刷新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23106177/