我正在使用一个显示对象数组的 CollectionView。
单击按钮时,我用一组新数据填充此数组。
我想用这些数据刷新 CollectionView。
是否有任何声明来更新它而不是比较每个项目并有选择地删除和添加? reloadData 通常会出现以下错误。
CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION
简而言之,我正在寻找以下步骤...
1)填充数据源数组,显示数据。
2)用新数据填充数据源数组,刷新CollectionView以显示数据。
提前致谢
Best Answer-推荐答案 strong>
尝试- (void)performBatchUpdatesvoid (^)(void))更新完成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: 作为合适。
我更喜欢响应式 KVO 版本,因为我倾向于将 Collection View 与 Core Data 一起使用,而不是伪静态或内存中的 NSArray。
为了找出 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION 问题,我会在所有异常上设置断点,并尝试找出真正触发问题的原因。可能您的数据源已消失,当您尝试从中读取/写入时访问不正确。
关于ios - UICollectionView 刷新数据,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/23106177/
|