objective-c – 核心数据合并两个管理对象上下文

objective-c – 核心数据合并两个管理对象上下文,第1张

概述我的Cocoa / Application在主线程上有一个受管对象上下文。 当我需要更新我的数据时,我的程序将: >开始一个新线程 >从服务器接收新数据 >创建一个新的管理对象上下文 >向主线程发送通知,以便合并这两个上下文 这是在主线程上接收通知的功能 - (void)loadManagedObjectFromNotification:(NSNotification *)saveNotifica 我的Cocoa / Application在主线程上有一个受管对象上下文。
当我需要更新我的数据时,我的程序将:

>开始一个新线程
>从服务器接收新数据
>创建一个新的管理对象上下文
>向主线程发送通知,以便合并这两个上下文

这是在主线程上接收通知的功能

- (voID)loadManagedobjectFromNotification:(NSNotification *)saveNotification{    if ([NSThread isMainThread]) {        [self.managedobjectContext mergeChangesFromContextDIDSaveNotification:saveNotification];    } else {        [self performSelectorOnMainThread:@selector(loadManagedobjectFromNotification:) withObject:saveNotification waitUntilDone:YES];         }}

我没有收到任何错误。
我的问题是合并结果,它实际上是从两个上下文连接托管对象。

我的实体是一个非常简单的属性和关系列表。

也许合并需要一些说明,以便了解何时更新的受管对象不是新的受管对象,而是第一个被编辑的版本。
我想像在某个地方我需要指定一种方式来统一识别一个实体(例如一个属性可以像ID一样),像一个合并策略(如果2个被管理对象代表同一个对象,则使用lastModificationDate更多的对象)最近)。

我只需要了解如何正确合并2个上下文,以便为每个对象单独更新一次。

更新1

问题现在明白了。
2上下文有很大的区别:ObjectID。
当主线程的上下文使用Persistent Store协调器获取Managedobject时,第二个线程通过获取远程URL创建这些对象。即使对象具有相同的内容,它们将具有两个不同的objectID。

我的对象已经是一个唯一的标识符,我可以使用setobjectID来设置这个值。 (苹果文档说这不是一个好主意)。

解决方法 这是您正确合并上下文所需要做的。
首先,您不需要自己的通知。在上下文中执行保存 *** 作会自动将以下通知转发给注册的观察者:

NSManagedobjectContextDIDSaveNotification

所以你需要做的就是:

1)在你的主线程中,可以在vIEwDIDLoad方法中注册此通知:

[[NSNotificationCenter defaultCenter] addobserver:self                                         selector:@selector(contextDIDSave:)                                             name:NSManagedobjectContextDIDSaveNotification                                            object:nil];

2)在主线程中实现contextDIDSave:方法,如下所示:

- (voID)contextDIDSave:(NSNotification *)notification{    SEL selector = @selector(mergeChangesFromContextDIDSaveNotification:);     [managedobjectContext performSelectorOnMainThread:selector withObject:notification waitUntilDone:YES];}

3)在你的dealloc方法中添加以下内容:

[[NSNotificationCenter defaultCenter] removeObserver:self];

4)在其他线程中使用以下方法创建一个新的上下文:

- (NSManagedobjectContext*)createNewManagedobjectContext{    NSManagedobjectContext *moc = [[NSManagedobjectContext alloc] init];     [moc setPersistentStoreCoordinator:[self persistentStoreCoordinator]];    [moc setUndoManager:nil];    return [moc autorelease];}

5)在收到新数据后,处理这种情况的正确方法是使用被管理对象ID。由于管理的对象ID是线程安全的,您可以将它们从主线程传递给另一个线程,然后使用existingObjectWithID:error:检索与特定ID相关联的对象,更新并保存上下文。现在合并将按照您的期望运行。或者,如果您不提前知道必须在线程之间传递管理对象ID,则在其他线程中,您只需使用谓词获取对象即可检索与从服务器检索到的对象相对应的对象,然后更新它们并保存上下文。

总结

以上是内存溢出为你收集整理的objective-c – 核心数据合并两个管理对象上下文全部内容,希望文章能够帮你解决objective-c – 核心数据合并两个管理对象上下文所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1039558.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存