簡體   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