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並將它傳遞給主線程,做核心數據的事情出現了。這是否工作?如果它有效,它會更好嗎?
謝謝。
我明白這一點。 如果我在主線程中執行它,我不需要創建一個新的NSManagedObjectContext,也不需要將它合併到主線程的上下文中,這似乎更簡單。 – cai 2011-06-02 00:45:15
執行後臺操作的主要原因是用戶界面在前臺/主線程上運行,所以綁定主線程的任何內容都會凍結用戶界面。由於服務器操作滯後,將服務器相關功能放在後臺線程中幾乎總是一個好主意。但是,您不必將數據保存在那裏。您可以將它傳遞給主線程並將其插入到上下文中。 – TechZen 2011-06-03 03:28:18