Мое приложение загружает и кэширует фотографии в coreData в фоновых потоках, в то же время позволяя пользователю копаться в приложении. В настоящее время после завершения загрузки данных фотографии я запускаю поток, чтобы сохранить его в coredata, используя предложенный общий storeCoordinator и принадлежащий потоку контекст, затем объединяюсь с основным потоком, я также блокирую общий координатор до момента непосредственного объединения. Эта блокировка вызывает проблемы с производительностью при чтении пользователем.
Мне нужно заблокировать здесь? Какие подводные камни не блокировка? Поток по сути:
-(void)saveThreaded:(args)args {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[NSThread setThreadPriority:.5];
[_appDelegate.persistentStoreCoordinator lock]; //necessary?
NSManagedObjectContext *_moc = [[NSManagedObjectContext alloc] init];
[_moc setPersistentStoreCoordinator: [_appDelegate persistentStoreCoordinator]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(threadControllerContextDidSave:)
name:NSManagedObjectContextDidSaveNotification object:_moc];
...<blah blah>...
}
- (void)threadControllerContextDidSave:(NSNotification*)saveNotification {
// need to unlock before we let main thread merge
[_appDelegate.persistentStoreCoordinator unlock];
[self performSelectorOnMainThread:@selector(mergeToMainContext:) withObject:saveNotification waitUntilDone:YES];
}
- (void)mergeToMainContext:(NSNotification*)saveNotification {
NSError *error;
[_appDelegate.managedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification];
if (![_appDelegate.managedObjectContext save:&error]) {
<handle error>
}
}