gpt4 book ai didi

ios - 多线程核心数据-NSManagedObject无效

转载 作者:行者123 更新时间:2023-12-01 18:32:46 24 4
gpt4 key购买 nike

顾名思义,我正在使用Core Data Application,该应用程序充满了不同后台线程中的对象(XML解析)

在我的后台线程中,我正在这样做

managedContext = [[NSManagedObjectContext alloc] init];
[managedContext setUndoManager:nil];

[managedContext setPersistentStoreCoordinator: [[DataManager sharedManager] persistentStoreCoordinator]];

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:managedContext];


NSMutableArray *returnSource = [[self parseDocument:doc] retain];


[managedContext save:&error];

if (error) {
NSLog(@"saving error in datafeed");
}

[managedContext reset];

[self performSelectorOnMainThread:@selector(parseCompleteWithSource:) withObject:returnSource waitUntilDone:YES];

合并方法如下所示:
NSManagedObjectContext *mainContext = [[DataManager sharedManager] managedObjectContext];

// Merge changes into the main context on the main thread
[mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
withObject:notification
waitUntilDone:YES];

[[NSNotificationCenter defaultCenter] removeObserver:self];

我认为合并是成功的,但是因为我想在UITableView中显示它,所以它总是告诉我对象是无效的,这是因为
[managedContext reset];

我想做的是显示当前在数据库中的项目,在后台解析xml,如果完成,我想用新的/更新的对象更新UITableView。我该怎么做,我可以将对象以某种方式“更新”到另一个上下文,还是合并不能正常工作?

我需要在Main ObjectContext中定义一些特定的东西吗?
我尝试了不同的合并政策,但没有任何运气。

希望你能帮助我,谢谢!

最佳答案

我相信您的问题是returnSource数组的内容。如果那是一堆NSManagedObject实例,那么它们将由后台线程上下文在后台线程上创建。

您调用-[NSManagedObjectContext reset]将使它们无效,因为这是您明确告诉上下文要执行的操作。但这不是大问题。

然后,您继续将数组发送到主线程,在线程边界上以及上下文之间传递NSManagedObject实例,这是一个很大的禁忌。

您需要做的是:

  • 使用NSManagedObjectIDNSManagedObject创建一个数组。
  • 通过线程边界发送对象ID数组。
  • 从新线程及其上下文的托管对象ID中使用NSManagedObject s重新创建一个数组。

  • 按照三个规则,我做了一些核心数据助手(第三次编写东西,使其通用)。

    最重要的是,我隐藏了为每个线程管理不同的托管对象上下文,处理通知以及所有垃圾的复杂性。相反,我引入了线程局部上下文的概念。基本上是懒创建的 NSManagedObjectContext实例,当当前线程退出时,它们会自动注册以进行更新和清除。

    正常用例:
    NSManagedObjectCotext* context = [NSManagedObjectCotext threadLocalContext];
    // Do your stuff!!
    NSError* error = nil;
    if (![context saveWithFailureOption:NSManagedObjectContextCWSaveFailureOptionThreadDefault
    error:&error])
    {
    // Handle error.
    }

    完整的源代码,包括用于解析来自apple.com的新闻RSS并将其存储在Core Data中的示例应用程序,可在以下位置找到: https://github.com/jayway/CWCoreData

    关于ios - 多线程核心数据-NSManagedObject无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6832244/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com