我有一个问题,我如何监听数据模型中的更改。
我有物业进度的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是如何工作的,但是我的应用程序被冻结了。
发布于 2014-09-06 00:02:59
您错误地设置了观察者,请使用以下代码来设置您的观察值。
for (SAPEmail *email in _emails)
{
[email addObserver:self forKeyPath:@"progress" options:NSKeyValueObservingOptionNew context:NULL];
}我还推荐适当触发KVO观察的setting the context parameter。
更新
当您想要观察Core Data中的更改时,您有一些选择。我认为你没有意识到有多种方法可以做到这一点。第一种方法是观察单个对象上单个属性的更改。这就是KVO方法。如果您希望侦听保存特定上下文的事件,则需要使用NSNotificationCenter方法。在对多个上下文进行更改时,您需要混合使用这两种方法。也就是说,如果您正在观察上下文A中的对象的属性,并且您在上下文B中对该对象/属性进行了更改,则需要在NSManagedObjectContextDidSaveNotification上设置KVO观察处理程序,以便将上下文B中的新更改合并到上下文A中。在那里,当上下文合并完成时,将触发对上下文A中的属性/对象的NSNotificationCenter观察。
在您的例子中,在您的managedOjbectContextDidSave:方法中,您需要调用-mergeChangesFromContextDidSaveNotification:来合并上下文之间的更改。我还建议使用多个上下文,而不是在SAPCoreDataEmailHelper类中包含单个上下文。当您进入多线程场景时,您将遇到具有单个上下文和多个线程的随机崩溃。
https://stackoverflow.com/questions/25689535
复制相似问题