ios – 如何在NSManagedObjects的集合(NSArray或NSSet)上设置KVO

前端之家收集整理的这篇文章主要介绍了ios – 如何在NSManagedObjects的集合(NSArray或NSSet)上设置KVO前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个iPad应用程序,它有一个实现NSFetchedResultsControllerDelegate的UITableViewController. (主要使用Stanford iOS类的CoreDataTableViewController code.)

我有一个辅助模型对象(self.locations),它是一个Location对象数组,它是NSManagedObjects的子类.此数组驱动UISegmentedControl的内容,该内容过滤我的主fetchedResultsContoller.

可以通过弹出窗口修改self.locations的内容.我想设置一些观察,以便我的主UITableViewController可以监视存储在self.locations中的对象的更改,并在必要时重新加载UISegmentedControl.

这也可能导致重新加载表中的主数据,所以我要小心不要在每次修改时重新加载.

我想我理解如何在单个NSManagedObject上设置KVO,但我不确定如何在数组中包含的对象上进行操作.我知道我可以使用另一个NSFetchedResultsController,但是我的self.locations对象没有驱动第二个UITableView,所以我不确定它是否有意义.

解决方法

如果您想知道是否添加,删除,替换或重新排序对象,那么观察一对多关系是非常简单的.事实上,它与普通对象完全相同:
  1. [self addObserver:self
  2. forKeyPath:@"locations"
  3. options:0
  4. context:NULL];

然后实现以下内容以接收通知(部分从Apple文档复制):

  1. - (void)observeValueForKeyPath:(NSString *)keyPath
  2. ofObject:(id)object
  3. change:(NSDictionary *)change
  4. context:(void *)context {
  5.  
  6. if ([keyPath isEqual:@"locations"]) {
  7. // Your custom code here.
  8. }
  9.  
  10. // Be sure to call the superclass's implementation *if it implements it*.
  11. [super observeValueForKeyPath:keyPath
  12. ofObject:object
  13. change:change
  14. context:context];
  15. }

不要忘记在某些时候停止观察:

  1. [self removeObserver:self forKeyPath:@"locations"];

而且,虽然你没有问,如果你想知道关系中包含的任何对象是否已经改变(而不仅仅是你在这里看到的NSSet),那么你必须观察各个对象.

编辑

根据您的评论,您确实希望观察单个对象.这对于“普通”对象来说相当简单,但是托管对象需要更多工作,因为您必须观察对象中的各个键,这看起来像这样:

  1. - (void)observeManagedObject:(NSManagedObject *)myObject {
  2. NSArray *myObjectKeys = [[[myObject entity] attributesByName] allKeys];
  3. for (NSString *key in myObjectKeys) {
  4. [myObject addObserver:self
  5. forKeyPath:key
  6. options:0
  7. context:nil];
  8. }
  9. }

然后你观察数组中的所有NSManagedObjects,如下所示:

  1. for (NSManagedObject *object in myArray) {
  2. [self observeManagedObject:object];
  3. }

反过来停止观察托管对象上的键!

猜你在找的iOS相关文章