2010-04-27 68 views
3

我有一个NSFetchedResultsController支持的UITableView,它可以在任何时候触发更新。如果用户正在重新排序行,将这些更新将导致异常,因为表视图暂时接管,你会得到像当UITableView被重新排序时检测

Invalid update: invalid number of rows in section [...] 

错误我如何检测,当用户已经开始移动的小区,所以我可以延迟更新结果控制器造成的更新吗?似乎没有任何表视图委托方法来检测这一点。该委托方法:

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath { 

在用户首次分离的第一个单元格不会被调用,只有当他们实际移动到其他地方。

一种解决办法是检查所取得的成果回调isEditing,只是做了散装reloadData,而不是动态插入/删除行,但我不知道是否有一种方法专门为“重排”模式检查。

回答

0

前表移动的排它发送...

– tableView:canMoveRowAtIndexPath: 

...它的数据源。您可以在该单元格实际移动之前放置一个编辑锁定,该锁定将生效。

你可能想重新考虑一下你的设计。这听起来像你有一个数据模型,可以同时修改两个不同的来源。如果是这样,那么您需要在数据模型本身内设置某种并发锁定,因此这两个修改实际上不能同时发生。同时修改不仅会导致用户界面出现问题,而且会导致使用数据模型的任何问题。

+0

但可能tableview可能会调用,而不是在移动单元格之前。没有文件记录,在移动单元之前总是调用它,所以依靠这种行为不太可能是未来的证明。我的数据模型没问题,我正在以标准方式将更改合并到核心数据模型中,以便在主线程上正确发送更改请求。 – 2010-05-07 10:15:55

+0

在UI移动单元格之前,每次调用此方法。数据模型驱动更改时不会调用它。唯一的目的是检查UI事件是否可以移动单元格。你将不得不设置标志来防止数据或用户改变表格,而另一个用户正在做它。你有一个竞争条件。 – TechZen 2010-05-07 16:17:19

1

你错了,tableView:canMoveRowAtIndexPath不能解决问题。

在要更新或删除的所有单元格上使用[cell setEditing:NO]。

如果用户正在拖动单元格,则拖动模式将被取消。

如果你需要[cell setEditing:YES],你可以在完成你正在更新的任何东西后立即恢复它。