【发布时间】:2014-09-05 15:43:37
【问题描述】:
我有一个问题,我如何才能听到我的数据模型的变化。
我有带有属性进度的 NSManagedObject 电子邮件。因此,当应用程序发送电子邮件时,我每次都会更新属性进度。
我想听数据模型,如果改变了更新我的视图。
我补充说:
for (SAPEmail *email in _emails)
{
[self addObserver:email forKeyPath:@"progress" options:NSKeyValueObservingOptionNew context:NULL];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"progress"])
{
SAPEmail *email = object;
NSLog(@">>>>>>>>>>> progress: %@", email.progress);
}
}
但似乎对我不起作用。
我也使用 MagicalRecord。
我也尝试观察上下文
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleDataModelChange:)
name:NSManagedObjectContextObjectsDidChangeNotification
object:myManagedObjectContext];
但是当我调试我的数据模型时,我的数据模型已经更新了 10 次(因为我更新了从 0 到 9 的进度),但是在所有更新完成后,handleDataModelChange 只调用了一次。但是每次更新数据模型以更新进度视图时,我都需要更新所有 10 个。
如果我用这个,再来一个
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(managedObjectContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:nil];
然后例如尝试刷新数据:
- (void)managedObjectContextDidSave:(NSNotification *)notification
{
NSLog(@">>>>>>>>>+++++");
_emails = [SAPCoreDataEmailHelper emailsWithStatus:EmailStatusInProgress];
[_theTableView reloadData];
}
+ (NSArray *)emailsWithStatus:(EmailStatus)status
{
NSPredicate *prediacte = [NSPredicate predicateWithFormat:@"status == %d", status];
NSArray *emails = [SAPEmail MR_findAllWithPredicate:prediacte];
return emails;
}
我可以看到 NSLog 是如何工作的,但是我的应用程序被冻结了。
【问题讨论】:
标签: ios core-data nsmanagedobject key-value-observing magicalrecord