如何识别来自特定NSManagedObjectContext保存操作的通知?

时间:2012-03-10 02:37:42

标签: ios cocoa core-data

我正在编写一个使用Core Data的应用程序,但是通过HTTP将其数据与服务器同步。我正在监视NSManagedObjectContext的通知,因此我可以响应数据中的更改。

根据初步回复进行了更新:感谢您的建议。好像我需要更好地解释一下:我在应用程序中使用Core Data,但也将更改发布到服务器,监视来自托管对象上下文的通知。

与此同时,我还定期轮询服务器的更改。当服务器发生更改时,我会相应地更新Core Data对象。但在那种情况下,我想避免将新更改的本地数据发布回服务器(因为它首先来自于它)。换句话说,当我收到我想要识别的通知并忽略它时,我想要禁止保存操作上的通知。

我目前没有对并发或线程做任何想象。如果这意味着我可以依赖托管对象上下文的保存通知以与保存操作完全相同的顺序进入,我可以在保存之前设置一个标志。那会有用吗?

(如果确实如此,如果我想在将来异步工作,那仍然会感觉很乱。有一些方法可以将通知绑定到特定的保存操作或完全禁止保存的通知。)

2 个答案:

答案 0 :(得分:1)

这是一个非常有趣的问题!

如果您不使用多线程,我会说使用BOOL标志。

如果您使用多线程并以10.6+为目标,则应在同一个并发的Grand Central Dispatch(或GCD)串行队列中执行所有Core Data操作(包括设置该标志)。

您可以像这样设置该队列:

dispatch_queue_t dataQueue = dispatch_queue_create("Data Queue", DISPATCH_QUEUE_SERIAL);

然后,您可以使用以下命令在该队列上执行核心数据操作:

dispatch_async(dataQueue, ^{
    //do work here
});

完成后不要忘记释放队列:

dispatch_release(dataQueue);

dataQueue也许可以用作ivar或通过某种+方法访问的全局变量。

发送到队列的所有操作都将按顺序执行(按照提交的顺序执行),因此如果所有操作都发送到同一队列,则应该没有线程安全问题。

Concurrency Programming Guide阅读Grand Central Dispatch(我个人认为这是一个非常酷的API)。

答案 1 :(得分:0)

由于spudwaffle说你可以从通知对象中的对象指针获取上下文。

您的合并回调方法可能如下所示:

- (void)mergeChanges:(NSNotification *)notification {
    if (notification.object != self.context) {
        [self.context mergeChangesFromContextDidSaveNotification:notification];
    }
}