Основные данные, сохранение потоков в постоянном хранилище без блокировки, что может пойти не так? - PullRequest
0 голосов
/ 08 апреля 2010

Мое приложение загружает и кэширует фотографии в 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>
}
}

1 Ответ

1 голос
/ 09 апреля 2010

Нет, вам здесь не нужна блокировка, NSManagedObjectContext заблокирует NSPersistentStoreCoordinator, и вы, вероятно, препятствует этому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...