繁体   English   中英

如果第一次CoreData为空,则再次执行ExecuteFetchRequest

[英]ExecuteFetchRequest a second time if the first time CoreData was empty

我正在开发一个应用程序,该应用程序将XML ant数据解析为CoreData。 我希望它能快速启动,因此我先从CoreData加载数据,然后再加载并解析其他线程中的XML。 问题是,当应用程序第一次启动时,CoreData为空,我开始解析:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SlideItem" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];

// Execute the fetch -- create a mutable copy of the result.
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

if (mutableFetchResults == nil) 
{
    // Handle the error.
    NSLog(@"mutableFetchResults == nil"); 
}

NSLog(@"mutableFetchResults count = %d", [mutableFetchResults count] );

if ([mutableFetchResults count] == 0 ) // if DB is empty
{
    [self loadAndParse]; // here I do it in the main thread
    //so my CoreData is filled with data here
}
//but if try to execute my request again like this:
mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
//it is empty again

我该怎么做? 谢谢

您必须在解析xml的线程中合并来自其他上下文的更改。 在执行此操作之前,主线程上的上下文不知道更改了什么。

采用:

-[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:]

要么

-[NSManagedObjectContext refreshObject:mergeChanges:]

如果将解析的数据加载到与上面片段中使用的解析的数据不同的托管对象上下文中,那么您需要按照TechZen的建议进行操作并合并这些上下文之间的更改。 苹果在其CoreDataBooks示例中提供了很好的解释。 查看RootViewController.m文件,并开始阅读addViewController:didSave:方法的注释。 所有代码都可以合并两个离散的受管对象上下文之间的更改(在CoreDataBooks中,它们创建了一个单独的受管对象上下文来编辑新的书本实体)。

另一方面,如果您的loadAndParse:使用与上面的代码相同的托管对象上下文,那么我认为您实际上没有成功地向Core Data存储添加任何内容。 在那种情况下,问题可能出在loadAndParse:方法上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM