我正在使用一个显示对象数组的CollectionView。 在单击按钮时,我使用一组新数据填充此数组。 我想用这些数据刷新CollectionView。 是否有任何声明来更新此而不是比较每个项目并有选择地删除和添加? reloadData通常会出现以下错误。
CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION
简而言之,我正在寻找以下步骤...... 1)填充数据源数组,显示数据。 2)用新数据填充数据源数组,刷新CollectionView以显示数据。
先谢谢
答案 0 :(得分:1)
尝试- (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:
。
我更喜欢反应式KVO版本,因为我倾向于使用Core Data的集合视图,而不是伪静态或内存中的NSArray。
要找出 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION 问题,我会在所有异常上设置一个断点,并尝试发现究竟是什么触发了这个问题。可能你的数据源已经消失,当你尝试从中读取/写入时,访问权限很糟糕。
答案 1 :(得分:0)
假设您到达了视图,那么您可以使用viewDidLoad
方法向数组中添加数据,如下所示:
-(void)viewDidLoad
{
[super viewDidLoad];
// If you have already data
self.arr_sample=(NSArray *)array;
/*
When you want to download data from server than you have to call reloadData
method of collection because all delegate method already called before view load.
So loading data will take time to load data than you have to call all delegate
method of collectionview by calling reloadData method.
*/
[self loadData];
// Do any additional setup after loading the view from its nib.
}
但首先你设置了collectionview的委托。 是否要从服务器下载数据,而不是调用reloaddata方法的集合视图。比如
-(void)loadData
{
// Do your downloading code her and call to reload data method of collectionview
[collectionview reloadData];
}
现在再次想要在按钮点击时使用新数据重新填充数组
-(void)refillData
{
// Download new data code here and follow
[array removeAllObjects];
array=(NSArray *)newarray;
[collectionview reloadData];
}