我对 Core Data 和 KVC 比较陌生,但我想要一些关于注册 Core Data 对象更改监听器的指导。情况如下:
我有一个名为 Patient
的 NSManagedObject
和另一个名为 Meduction
的 NSManagedObject。一个Patient
可能有很多Meminations
,并且一个Memination
有一个startOn
和endOn
日期。
我想以某种方式监听所有 Meduction
对象的 endOn
属性的更改。当发生更改时,我想在 iOS 设备上安排本地通知。我以前使用过本地通知,但不知道在这种情况下将其代码放在哪里。
我是否在应用程序委托(delegate)中创建调度代码并以某种方式注册应用程序委托(delegate)以监听 Meduction
对象中的更改?这是否需要附加到NSManagedObjectContext
?
这是如何完成的?指针将不胜感激!
谢谢!
最佳答案
使用键值观察,您需要一些实例来进行观察。有时,这可能是在药物上调用 -setEndOn: 的同一个对象;有时可能必须是其他东西。假设您的应用程序有一个 MeminationManager 类 - 创建了一个实例。并且,进一步假设 MedicateManager 有一个实例方法 -createMedicateWithName:startOn:endOn: ,如下所示:
- (Medication*) createMedicationWithName:(NSString*)medName startOn:(NSDate*)startDate endOn:(NSDate*)endDate
{
// Create and configure a new instance of the Compound entity
Medication *newMedication = (Medication *)[NSEntityDescription insertNewObjectForEntityForName:@"Medication"
inManagedObjectContext:[self managedObjectContext]];
[newMedication setName:medName];
[newMedication setStartOn:startDate];
[newMedication setEndOn:endDate];
// Set up KVO
[newMedication addObserver:self
forKeyPath:@"endOn"
options:NSKeyValueObservingOptionNew
context:nil];
return newCompound;
}
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([keyPath isEqualToString:@"endOn"])
{
// ... schedule local notification on the iOS device for (Medication*)object.
return;
}
}
或者类似的东西。
请注意,当您删除药物时,您需要删除观察者...此外,在启动应用程序时,您需要将药物管理器建立为现有药物的观察者。我认为这可能就像迭代所有药物并为每个药物调用 addObserver 一样简单。如果您有很多药物,那么您可能希望以更“懒惰”的方式执行此操作(即,在 -awakeFromFetch 中)。
关于iphone - 核心数据 - 监视更改并注册本地通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4833655/