2011-06-01 36 views
1

我從服務器獲取一些數據,我需要解析它。然後,一些解析結果可能需要使用核心數據進行保存。核心數據和併發性,2個解決方案,我使用哪種方式?

現在這是我的代碼:

- (void)receiveSomeMessage:(NSString *)message 
{ 
    [self performSelectorInBackground:@selector(parseMessage:) withObject:message]; 
} 

- (void) parseMessage:(NSString *)message 
{ 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
    NSManagedObjectContext *BGMOC = [[NSManagedObjectContext alloc] init]; 
    [BGMOC setPersistentStoreCoordinator:[self.appDelegate persistentStoreCoordinator]]; 

    //parse it 
    //write to core data 

    NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter]; 
    [dnc addObserver:self selector:@selector(addContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:BGMOC]; 

    NSError *saveError; 
     if (![BGMOC save:&saveError]) { 
      //handle the error 
     } 
    [dnc removeObserver:self name:NSManagedObjectContextDidSaveNotification object:BGMOC]; 
} 

- (void)addContextDidSave:(NSNotification*)saveNotification { 

// Merging changes causes the fetched results controller to update its results 
[self.appDelegate.managedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification]; 
} 

這似乎是工作。

但蘋果的文件說:保存在後臺線程是容易出錯的。

所以我想是這樣的工作:解析消息

-(void) parseMessage:(NSString *)message 

{ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    //parse it and save it to a dictionary 
    [self performSelectorOnMainThread:@selector(saveToCoreData:) withObject:dictionary waitUntilDone:YES]; 
[pool release]; 
} 

後,I包成一個dictionery並將它傳遞給主線程,做核心數據的事情出現了。這是否工作?如果它有效,它會更好嗎?

謝謝。

回答

3

Apple docs不說,節省的背景在技術上是容易出錯的,它們意味着程序員容易使保存在後臺時的錯誤:

異步隊列和線程不要 阻止應用程序退出。 (具體而言,所有基於NSThread- 線程是「分離」 - 參見該 文檔並行線程完整 細節和過程只運行,直到所有 不獨立式線程已經退出)。 如果執行保存操作一個 後臺線程,因此,它可能在 完成之前被殺死。如果您需要保存 後臺線程,則必須編寫 附加代碼,以便主線程可以阻止應用程序從 退出,直到完成所有保存操作 。

翻譯:「退出時,程序員必須特別注意後臺操作的保存狀態,而且很多時候,他們不會。」

+0

我明白這一點。 如果我在主線程中執行它,我不需要創建一個新的NSManagedObjectContext,也不需要將它合併到主線程的上下文中,這似乎更簡單。 – cai 2011-06-02 00:45:15

+0

執行後臺操作的主要原因是用戶界面在前臺/主線程上運行,所以綁定主線程的任何內容都會凍結用戶界面。由於服務器操作滯後,將服務器相關功能放在後臺線程中幾乎總是一個好主意。但是,您不必將數據保存在那裏。您可以將它傳遞給主線程並將其插入到上下文中。 – TechZen 2011-06-03 03:28:18

相關問題