2

我将 NSFetchedResultsController 与我的 UITableView 一起使用。我成功地收到了委托调用,- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath但我对 UITableView 中的插入/更新/删除行所做的任何更改都没有真正显示出来。我什至只是尝试在 UITableView 上设置背景颜色以查看是否会显示任何更改,但除非我推送新的视图控制器然后弹回,否则它们不会显示。然后我会看到背景颜色和表格更新。

我对 didChangeObject: 方法的实现实际上只是样板模板:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView beginUpdates];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView endUpdates];
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath
{
    UITableView *tableView = self.tableView;

    switch(type) {
        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            tableView.backgroundColor = [UIColor redColor];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            tableView.backgroundColor = [UIColor blueColor];
            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}

我在导航栏中添加了一个带有 IBAction 的按钮,该按钮只调用[self.tableView reloadData];,每当我点击它时,所有的插入和更新都会显示在表格中。但是,它们不会随着更改的发生而出现。

怎么了?

4

1 回答 1

3

看起来对didChangeObject(和其他方法)的委托调用没有发生在主线程上,这意味着它们无法更新 UI,但这些更改只是默默地被删除了。

我更新了上面包含的三个方法,以便这些方法的主体都在主线程上分派,并且一切都按预期工作。下面是一个例子:

dispatch_sync(dispatch_get_main_queue(), ^{
        [self.tableView beginUpdates];
});
于 2013-10-11T00:44:19.643 回答