Параллелизм базовых данных - NSManagedObjectContext - PullRequest
2 голосов
/ 24 декабря 2010

Так что мне нужно использовать контекст управляемого объекта cora-data, используя несколько потоков.Я обнаружил, что приведенная ниже реализация в значительной степени мне нужна.У меня есть 2 вопроса:

  1. Где я могу освободить MOC, который я выделяю?Я не хочу просматривать каждый поток функций в моем приложении и вызывать функцию для освобождения MOC.Я лучше напишу функцию и каким-то образом сделаю так, чтобы она вызывалась каждым потоком до его выхода.это возможно?

  2. Достаточно ли приведенной ниже реализации для параллелизма основных данных?

    -(void) StoreManagedObjectContextForCurrentThread:(NSManagedObjectContext*) context
    {
        [[[NSThread currentThread] threadDictionary] setObject: context forKey: AQPerThreadManagedObjectContext];
    }
    
    
    -(NSManagedObjectContext *) myManagedObjectContext {
    
    
        NSManagedObjectContext * result = [[[NSThread currentThread] threadDictionary] objectForKey: AQPerThreadManagedObjectContext];
        if ( result != nil )
            return result;
    
        NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
        if (coordinator!=nil)
        {
            NSManagedObjectContext * moc = [[NSManagedObjectContext alloc] init];
            [moc setMergePolicy: NSMergeByPropertyObjectTrumpMergePolicy];
            [moc setPersistentStoreCoordinator: coordinator];
            [self StoreManagedObjectContextForCurrentThread:moc];
            [moc release];      // now owned by the thread dictionary
            return moc;
        }
    
        return nil;
    }
    

1 Ответ

2 голосов
/ 24 декабря 2010

В предоставленной вами реализации у вас нет способа освободить контекст управляемого объекта до исчезновения потока, потому что его время жизни определяется словарем потока, а означает, что время жизни объекта равнообрабатывается Фондом, а не вами.

Если вы хотите управлять временем жизни объектов, вам нужно управлять их хранением.Это значит отойти от использования -threadDictionary.Один из вариантов - реализовать фоновую работу в качестве NSOperation подклассов и поддерживать контексты управляемого объекта на протяжении всего времени выполнения операций, но это, вероятно, большое изменение по сравнению с тем, что у вас есть в настоящее время.

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