2013-08-28 93 views
7

在UITableView上使用- (void)beginUpdates- (void)endUpdates时,您是否必须对呼叫中的数据源进行更改?UITableView开始/结束更新

如果我有一个名为NSMutableArray驾驶dataSourcetableView我能做到这一点...

// edit the actual data first 
[dataSource addObject:@"Blah"]; 

// now update the table 
[self.tableView beginUpdates]; 

[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:dataSource.count - 1 inSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; 

[self.tableView endUpdates]; 

还是有必要做......

[self.tableView beginUpdates]; 

[dataSource addObject:@"Blah"]; 

[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:dataSource.count - 1 inSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; 

[self.tableView endUpdates]; 

刚问,因为我有几个地方我正在更新,我可能会将公共代码带出一个函数。

但只有当我可以更新外部的更新电话。

回答

10

在tableView beginUpdates/endUpdates之间更新数据源通常是一个好主意。在调用endUpdates之后,操作系统将触发dataSource调用来获取分区和行计数。如果在这一点上,数据源还没有更新,那么你可能会得到tableView不一致的崩溃。

在某些情况下,它可能会在tableView beginUpdates/endUpdates调用之前更新数据源,但是您必须确保您正在同一个线程和同一个运行循环中更新数据源。由于tableView更新必须在主线程上完成,这意味着您必须在主线程上进行数据源更新。

如果你更新数据源,并且不立即做你的tableView更新(你做了类似旋转屏幕的事情),那么你可以得到一个tableView不一致性崩溃。

+0

我应该在哪里添加这些代码行 - 在viewdidload中?或cellforrowatindexpath?或任何其他方法? –

+0

这是非常重要的“你必须确保你在同一线程中更新数据源” – Siyavash

+0

@Siyavash我该怎么做?我有几个代表更新数据源,如何确保在同一个线程中更新它们。 – titan

2

我一直使用第一种方法,它没有问题。只要确保在更改数据源之后立即更新您的表格。

2

没有规则说明数据源更新必须在开始/结束调用中。确保在更新数据源之后,根据需要插入/删除行,以免长期破坏。

3

我刚刚遇到了这个,也不知道它是什么最好的方式。但是,官方文件Table View Programming Guide的确提供了一些有关这方面的信息。在“成批的插入和删除操作的为例”,提到:

要插入并在一个表视图中删除的一组行和段的,首先准备阵列(或阵列),其是部分和行的数据源。在删除并插入行和节之后,将从此数据存储区填充生成的行和节。

希望这会有所帮助。如果有人能更好地解释它,我就更加清楚地了解这一点。