我的项目中有for loop
,如下所示:
for (int i = 0; i < 2; i++) {
[array addObject:randomObject];
[self.tableView reloadData];
}
我有这样的dataSource方法:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSLog(@"Count: %lu",(unsigned long)array.count);
return [array count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Reloading Data");
static NSString *CellIdentifier = @"Random";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
return cell;
}
但由于某些奇怪的原因,只有numberOfRowsInSection
被调用而cellForRowAtIndexPath
没有被调用。
此外,在循环的最后一次(当x = 1时)调用cellForRowAtIndexPath
答案 0 :(得分:4)
tableview仅在更新其视图层次结构时询问单元格。不重新加载其数据时。这只会导致它更新其内部大小信息。
仅在runloop进入时才会更新单元格。当您处于循环中时,主线程被阻塞,然后runloop不会进行。
只有在循环之后,操作系统才会运行runloop,而表格会调用Cells。
答案 1 :(得分:2)
在同一个线程上调用所有数据源方法。通过调用reloadData
,您可以启动数据源方法的“队列”,再次调用它可以取消之前的“队列”。这种机制可以保护数据源不会出现不一致,就像您更改了数据一样(因此下一次reloadData
调用),第一个“队列”操作将会过时。