В моем приложении я получаю запросы с содержимым JSON, анализирую их и сохраняю в CoreData. В то же время пользователь взаимодействует с БД (доступ для чтения и записи).
После сохранения данных в БД запускается вторая задача, которая создает новые данные на основе полученных данных. Я собираюсь использовать Grand Central Dispatch для анализа и хранения данных в БД.
Моя проблема заключается в том, что при использовании GCD я получаю EXC_BAD_ACCESS
, что может быть связано с неосновной безопасностью Core Data, которую я предполагаю. Другая ошибка заключается в том, что я получаю тупик при использовании контекста performBlockAndWait
.
Как мне разработать свое приложение, которое правильно обрабатывает GCD и NSMutableContexts
?
------- EDIT --------
Теперь, когда я прочитал руководство по программированию основных данных, я пришел к выводу, что должен использовать шаблон ограничения потока.
Мое приложение в настоящее время структурировано следующим образом: у меня есть пара менеджеров, каждый из которых имеет свой собственный контекст. Но при использовании нескольких потоков я дохожу до того, что 3 потока вызывают один и тот же Менеджер, что означает, что один контекст используется 3 потоками одновременно. Это приводит к тупику.
Чтобы решить эту проблему, я пришел к мысли создать контекст по имени потока, например:
- (NSManagedObjectContext *)createManagedObjectContextWithTreadName:(NSString*) threadname {
if([NSThread currentThread].name.length ==0){
[NSThread currentThread].name = threadname;
}
NSManagedObjectContext *context = nil;
context = [self.contextStore objectForKey:threadname];
if(!context){
NSLog(@"Creating context for threadname: %@",threadname);
NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator;
if (coordinator != nil)
{
context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
context.persistentStoreCoordinator = coordinator;
context.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy;
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(mergeChangesFromMOC:) name:NSManagedObjectContextDidSaveNotification object:context];
[self.contextStore setValue:context forKey:threadname];
}
}
return context;
}
Это хорошая идея?