2010-07-21 27 views
0

我正在開發一個應用程序,該應用程序解析XML Ant將數據放入CoreData。我希望它能夠快速啓動,因此我首先從CoreData加載數據,然後在其他線程中加載和解析XML。問題是,當應用程序啓動第一次CoreData是空的,我開始解析:ExecuteFetchRequest如果第一次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

您必須合併來自解析xml的線程中其他上下文的更改。在你這樣做之前,主線程的上下文不知道發生了什麼變化。

用途:

-[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:] 

-[NSManagedObjectContext refreshObject:mergeChanges:] 
+0

謝謝,我該怎麼辦?我是新來的Objective-C所以需要清楚, 我試過 [NSManagedObjectContext refreshObject:managedObjectContext mergeChanges:YES]; 但它不起作用( – Burjua 2010-07-21 17:24:27

+0

和順便說一句,這是相同的線程)) – Burjua 2010-07-21 17:28:06

+0

'refreshObject:'是從進行更改的上下文中調用的。你不通過上下文,你通過改變的對象。在爲上下文B中的ContextDidSave通知註冊上下文A後,會調用mergeChanges。 – TechZen 2010-07-22 01:09:34

1

如果您加載您的分析數據轉化爲比你在上面剪斷使用一個不同的管理對象範圍內,那麼你需要做的TechZen建議併合並這些背景之間的變化。 Apple在他們的CoreDataBooks示例中提供了一個很好的解釋。查看RootViewController.m文件並開始閱讀addViewController:didSave:方法的註釋。所有的代碼都是爲了合併兩個離散的託管對象上下文之間的變化(在CoreDataBooks中它們創建了一個單獨的託管對象上下文來編輯新的圖書實體)。

另一方面,如果您的loadAndParse:與上面的代碼使用相同的託管對象上下文,那麼我認爲您實際上並未成功向Core數據存儲添加任何內容。在這種情況下,問題可能是loadAndParse:方法。

相關問題