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