Dee*_*kie 6 core-data key-value-observing nsfetchedresultscontroller ios
我有一个iPad应用程序,UITableViewController它实现了NSFetchedResultsControllerDelegate.(主要使用 斯坦福iOS类的CoreDataTableViewController 代码.)
我有一个辅助模型对象(self.locations),它是一个Location对象数组,是它的子类NSManagedObjects.这个数组驱动一个UISegmentedControl过滤我的主要内容fetchedResultsContoller.
可以self.locations通过弹出窗口修改内容.我想设置一些观察,以便我的主要人员UITableViewController可以观察存储在其中的对象的变化,self.locations并在UISegmentedControl必要时重新加载.
这也可能导致重新加载表中的主数据,所以我要小心不要在每次修改时重新加载.
我想我理解如何在一个单独设置KVO,NSManagedObject但我不知道如何在数组中包含的对象上进行.我知道我可以使用另一个NSFetchedResultsController,但是我的self.locations对象没有驱动第二个UITableView,所以我不确定它是否有意义.
lna*_*ger 10
如果您想知道是否添加,删除,替换或重新排序对象,那么观察一对多关系是非常简单的.事实上,它与普通对象完全相同:
[self addObserver:self
forKeyPath:@"locations"
options:0
context:NULL];
Run Code Online (Sandbox Code Playgroud)
然后实现以下内容以接收通知(部分从Apple文档复制):
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if ([keyPath isEqual:@"locations"]) {
// Your custom code here.
}
// Be sure to call the superclass's implementation *if it implements it*.
[super observeValueForKeyPath:keyPath
ofObject:object
change:change
context:context];
}
Run Code Online (Sandbox Code Playgroud)
不要忘记在某些时候停止观察:
[self removeObserver:self forKeyPath:@"locations"];
Run Code Online (Sandbox Code Playgroud)
而且,虽然你没有问,如果你想知道关系中包含的任何对象是否已经改变(而不仅仅是你在这里看到的NSSet),那么你必须观察各个对象.
编辑
根据您的评论,您确实希望观察单个对象.这对于"普通"对象来说相当简单,但是托管对象需要更多工作,因为您必须观察对象中的各个键,这看起来像这样:
- (void)observeManagedObject:(NSManagedObject *)myObject {
NSArray *myObjectKeys = [[[myObject entity] attributesByName] allKeys];
for (NSString *key in myObjectKeys) {
[myObject addObserver:self
forKeyPath:key
options:0
context:nil];
}
}
Run Code Online (Sandbox Code Playgroud)
然后你观察数组中的所有NSManagedObjects,如下所示:
for (NSManagedObject *object in myArray) {
[self observeManagedObject:object];
}
Run Code Online (Sandbox Code Playgroud)
反过来停止观察托管对象上的键!
| 归档时间: |
|
| 查看次数: |
5581 次 |
| 最近记录: |