/ / ExecuteFetchRequest за втори път, ако за първи път CoreData е празна - iphone, core-data

ExecuteFetchRequest за втори път, ако за първи път CoreData беше празен - iphone, core-data

Разработвам приложение, което анализира XMLЗадайте данни в 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

Как мога да го направя? Благодаря

Отговори:

2 за отговор № 1

Трябва да обедините промените от другия контекст в нишката, където се анализира xml. Докато не направите това, контекстът на главната нишка не знае какво е променено.

Употреба:

-[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:]

или

-[NSManagedObjectContext refreshObject:mergeChanges:]

1 за отговор № 2

Ако зареждате вашите анализирани данни в aразличен контекст на управлявания обект от този, който използвате в изрязания по-горе, тогава трябва да направите, тъй като TechZen предлага и обединява промените между тях. Apple дава добро обяснение в техните CoreDataBooks пример. Вижте RootViewController.m файл и започнете да четете коментарите за addViewController: didSave: метод. Целият код е там, за да обедини промените между два контекста на дискретни управлявани обекти (в CoreDataBooks те създават отделен контекст на управлявания обект, за да редактират нов обект на книга).

Ако, от друга страна, loadAndParse: използва същия управляван обект контекст като кода по-горе, тогава аз не мисля, че всъщност успешно добавяте нищо в Core Data Store.