首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在更新NSManagedObject属性时跟踪该属性并立即更新视图

在更新NSManagedObject属性时跟踪该属性并立即更新视图
EN

Stack Overflow用户
提问于 2014-09-05 23:43:37
回答 2查看 500关注 0票数 0

我有一个问题,我如何监听数据模型中的更改。

我有物业进度的NSManagedObject电子邮件。因此,当应用程序发送电子邮件时,我每次都会更新属性进度。

我想要倾听数据模型,如果发生更改,则更新我的视图。

我补充道:

代码语言:javascript
运行
复制
 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。

我还试着观察上下文

代码语言:javascript
运行
复制
[[NSNotificationCenter defaultCenter] 
      addObserver:self 
         selector:@selector(handleDataModelChange:) 
             name:NSManagedObjectContextObjectsDidChangeNotification 
           object:myManagedObjectContext];

但是当我调试我的数据模型时,我已经更新了10次(因为我从0到9的更新进度),但是在所有的更新之后,handleDataModelChange只调用了一次。但每次更新数据模型以更新进度视图时,我都需要获取所有10个更新。

如果我用这个再来一次

代码语言:javascript
运行
复制
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(managedObjectContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:nil]; 

然后,例如尝试刷新数据:

代码语言:javascript
运行
复制
- (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是如何工作的,但是我的应用程序被冻结了。

EN

Stack Overflow用户

发布于 2014-09-06 00:02:59

您错误地设置了观察者,请使用以下代码来设置您的观察值。

代码语言:javascript
运行
复制
 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类中包含单个上下文。当您进入多线程场景时,您将遇到具有单个上下文和多个线程的随机崩溃。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25689535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档