У меня была похожая проблема при попытке асинхронной передачи данных с моего сервера в приложение. Мой метод немного другой, но в основном он здесь (это проект 4.3, поэтому нет ARC):
Следующие методы находятся в моем синглтоне DataUpdater. Этот первый метод вызывается при запуске приложения:
- (void) update { //download the updates on a new thread
[NSThread detachNewThreadSelector:@selector(updateThread)
toTarget:self withObject:nil];
}
Он инициализирует поток с этим селектором, который отвечает только за загрузку контента из API, а затем передает его обратно в основной поток для сохранения.
- (void) updateThread { //the actual update thread
//New thread, new auto-release pool
//(dunno if you need to do anything fancy for ARC)
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
//...
//YOUR CODE TO DOWNLOAD (BUT *NOT* SAVE) DATA FROM THE SERVER
//DON'T CREATE ANY MANAGED OBJECTS HERE
//...
//Pass the data to the main thread to perform
//the commit to the Core Data Model
[self performSelectorOnMainThread:@selector(saveUpdate:)
withObject:data waitUntilDone:NO];
//kill the thread & the auto-release pool
[NSThread exit];
[pool release];
}
Теперь, когда мы вернулись в основной поток, данные добавляются в Базовую модель данных, а затем контекст сохраняется.
- (void) saveUpdate:(NSArray *) data {
//add the objects to your Core Data Model
//and save context
NSError * error = nil;
[[[CoreManager defaultCoreManager] CoreContext] save:&error];
if (error) {
[NSException raise:@"Unable to save data update"
format:@"Reason: %@", [error localizedDescription]];
} else {
[[NSNotificationCenter defaultCenter] postNotification:
[NSNotification notificationWithName:@"DONE" object:nil]];
}
}