Ios KVO在UITableView中观察模型更改的最佳实践

Ios KVO在UITableView中观察模型更改的最佳实践,ios,iphone,objective-c,uitableview,key-value-observing,Ios,Iphone,Objective C,Uitableview,Key Value Observing,让我们想象一个基本的iPhone应用程序,它有一个表视图来显示人员列表,还有一个详细信息视图来更改嵌入在导航控制器中的人员的姓名 我正在使用KVO在我的表视图控制器中得到通知,在详细信息控制器中某人的姓名已被更改 我的问题是何时/何地添加和删除我的表视图控制器,作为每个person对象的名称的观察者 我的做法: @implementation PeopleTableViewController - (void)tableView:(UITableView *)tableView willDi

让我们想象一个基本的iPhone应用程序,它有一个表视图来显示人员列表,还有一个详细信息视图来更改嵌入在导航控制器中的人员的姓名

我正在使用KVO在我的表视图控制器中得到通知,在详细信息控制器中某人的姓名已被更改

我的问题是何时/何地添加和删除我的表视图控制器,作为每个person对象的
名称的观察者

我的做法:

@implementation PeopleTableViewController 

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    Person *person = ...; // person for index path

    [person addObserver:self forKeyPath:@"name" options:0 context:(__bridge void *)(PERSON_NAME_CTX)];
}

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    Person *person = ...; // person for index path

    [person removeObserver:self forKeyPath:@"name"];

    // This is not called when the view is removed from the hierarchy
    // Can't use viewDidDisappear: because we are using a navigation controller
    // and tableView:willDisplayCell: is not called when we return from the details controller
}

- dealloc {
    // See comment in didEndDisplayingCell:

    for (UITableViewCell *cell in self.tableView.visibleCells) {
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

        Person *person = ...; // person for index path

        [person removeObserver:self forKeyPath:@"name"];
    }
}
由于导航控制器的原因,事情有点棘手,因为从视图层次结构中删除视图时不会调用
tableView:didendisplayingcell
。我无法删除
视图中将消失的观察者:
,因为当用户从details controller返回时,我仍然需要观察person对象的更改


删除
dealloc
中的观察者似乎有效。我的问题:这是正确的方法吗?

通常您应该分别调用ViewWillExample/ViewWillEnglishe方法上的addObserver/removeObserver,因为dealloc方法与此调用不平衡(我的意思是可以调用比上述方法少的次数)。也许最好的解决方案之一是使用NSFetchedResultsController来跟踪数据源的任何更改。

谢谢您的回答。我不使用核心数据,因此无法使用
NSFetchedResultsController
。此外,我无法删除
视图中的观察者将消失:
,因为需要通知我用户在详细视图控制器中所做的更改。(我使用的是导航控制器)我明白了,我认为在ViewWillExample上重新加载数据会更好:为什么重新加载?这会起作用,但似乎不对。一切都安排得很好。导航控制器负责一切。我需要做的就是在另一个视图控制器中的模型发生更改后更新我的视图。是的,但要考虑到,如果所有更改(名称更改)都发生在推送的视图控制器上,则单元格不可见(并且无法更新)。在ViewWillAppeard上重新加载数据比观察值变化更好。在这种情况下,KVO没有意义,因为单元格上的更新不是实时的。好的,我会给ViewWillDisplay:一次尝试。谢谢