【问题标题】:Handling multiple managedobjectcontext处理多个托管对象上下文
【发布时间】:2013-10-22 11:18:21
【问题描述】:

我有三个托管对象上下文,即:

masterManagedObjectContext(NSPrivateQueueConcurrencyType), 
backgroundMangedObjectContext(NSPrivateQueueConcurrencyType), 
uiManagedObjectContext(NSMainQueueConcurrencyType)

Master 是父级,另外两个是它的子级。当我保存任何子上下文时,我会保存主上下文。但是当backgroundMangedObjectContext保存在master中时,UIManagedObjectContext并没有得到executeFetchRequest中的更新数据。

我如何实现这一目标?请帮忙。在过去的三天里,我非常关注这个问题。

有一些帖子建议,当 master 被保存时,我必须使以前获取的对象无效。但我不知道该怎么做。

我试过了

[UIManagedObjectContext reset]

但没有运气。

【问题讨论】:

    标签: ios objective-c multithreading core-data managedobjectcontext


    【解决方案1】:

    试试这个,

    需要在viewDidLoad或者init方法中添加观察者,

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:)
    name:NSManagedObjectContextDidSaveNotification object:nil];
    

    并实现这个方法,

    无论您在何处调用此方法 [context save:nil],它都会自动调用并且更改将更新到 masterContext。

    - (void)contextDidSave:(NSNotification *)notification
    {
        SEL selector = @selector(mergeChangesFromContextDidSaveNotification:);
        [[self masterManagedObjectContext] performSelectorOnMainThread:selector withObject:notification waitUntilDone:YES];
    
    }
    

    【讨论】:

    • 实际上 masterManagedObjectContext 正在获取更新的更改。但我的 uiManagedObjectContext 不是。
    • 您要更新哪个mangedObjectContext,在这段代码中使用它。[yourManageObjectContext performSelectorOnMainThread:]
    • 我也读到过,在iOS5之后我们不需要做这个mergeChangesFromContextDidSaveNotification。当我们使用父/子上下文时,它会被自动处理。我错了吗?
    • 如果使用不同的上下文,则需要使用此方法。我在我的项目中也面临这个问题,我是这样处理的。
    猜你喜欢
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多