UITableView NSFetchedResultsController哲学

时间:2012-01-11 18:35:11

标签: uitableview nsfetchedresultscontroller uianimation

我使用CoreData作为UITableView的容器,在NSFetchedResultsController中显示来自NSManagedObjects的数据。删除行的代码运行良好,但我的实现让我觉得不那么优雅。还有更好的方法吗?

下面的代码说明了删除事件:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

{
    if (editingStyle == UITableViewCellEditingStyleDelete) {

        // Delete the row from the data source 
       [myContext deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];

        if (![myContext save:&error]) { 
            // Error handling
        }  

        fetchedResultsController = nil;

        if (![[self getFetchedResultController] performFetch:&error]) {
             // Error handling
        }
        [tableView reloadData];        
    }   
}

我将fetchedResultsController设置为nil并执行另一次提取以更新新内容。

我担心的是,我在各种论坛上看到过引用,暗示上下文中的更改应该自动生成fetchedResultsController中的更改,并且可能不需要第二次获取。我此时尚未实施部分。

另一个问题是代码只是让行消失而没有任何动画。

可以引入一些光滑的动画吗?

1 个答案:

答案 0 :(得分:2)

使用NSFetchedResultsControllerDelegate Protocol methods来管理对表和数据库的更改。这样,只要在NSFetchedResultsController的NSManagedObjectContext中进行保存,就会通过托管的ojbect上下文通知fetchedResultsController。然后fetchedResultsCotnroller将调用其委托方法。

您希望实现controllerWillChangeContent:和controllerDidChangeContent:因此您可以通过调用表视图的beginUpdates和endUpdates方法来包含其他委托方法的调用。 (请参阅参考中的示例。)这可以防止表视图与fetchedResultsController失去同步。

然后删除这些行:

 fetchedResultsController = nil;

        if (![[self getFetchedResultController] performFetch:&error]) {
             // Error handling
        }
        [tableView reloadData];     

完成此操作后,您可以在插入和删除单元格中引入动画。

相关问题