在后台线程中更新托管对象上下文

Posted

技术标签:

【中文标题】在后台线程中更新托管对象上下文【英文标题】:Update managed object context in background thread 【发布时间】:2012-02-23 11:31:59 【问题描述】:

在我的 iPhone 上,我在后台线程中使用托管对象上下文 (MOC) 将来自服务器的消息与存储在数据库中的消息同步。为了防止重复,我使用谓词获取新消息的 id,并检查这些消息是否已经在数据库中。导入完成后,我将后台线程上的 MOC 与主线程上的默认 MOC 合并。到现在为止还挺好。

但是如果用户在主线程上创建了一条新消息同时消息是同步的(并且我已经在后台 MOC 上进行了提取以检查重复项)我如何更新后台 MOC防止重复消息?

最好的问候 卡斯滕

【问题讨论】:

【参考方案1】:

你可以通过观察NSManagedObjectContextDidSaveNotification来获得主线程变化的通知:

[[NSNotificationCenter defaultCenter]
    addObserver:self
    selector:@selector(updateMessages:)
    name:NSManagedObjectContextDidSaveNotification
    object:mainManagedObjectContext];

您的 updateMessages: 方法采用 NSNotification 参数:

- (void)updateMessages:(NSNotification *)notification

    [myManagedObjectContext mergeChangesFromContextDidSaveNotification:notification];

您可以使用 [notification userInfo] 获取更细粒度的更新信息。

【讨论】:

据我了解,通知发布在创建它的线程上。我的导入在 NSOperation 中运行。怎么在后台线程调用updateMessages方法(不知道怎么获取后台线程的引用来调用performSelector:onThread...)? 您可以在 myManagedObjectContext 上使用 performBlock: 让合并在其自己的队列中运行。只需确保在创建它时使用 initWithConcurrencyType:NSPrivateQueueConcurrencyType。

以上是关于在后台线程中更新托管对象上下文的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 3 托管对象上下文

在后台线程上安全保存 Core Data 托管对象上下文的正确方法?

在后台队列中保存临时托管对象上下文

Core Data 托管对象上下文线程同步

在多线程上下文中,在托管对象上设置属性时,CoreData 阻塞

托管对象上下文未保存到持久存储