在后台线程中更新托管对象上下文
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 托管对象上下文的正确方法?