Этот метод вызывает проблемы параллелизма? - PullRequest
0 голосов
/ 02 июня 2011

У меня есть класс CoreDataUtilities с методом класса, который сохраняет контекст управляемого объекта и устраняет любые ошибки:

+ (void)saveContext:(NSManagedObjectContext*)moc {
    NSError *error = nil;
    if (moc != nil) {
        if ([moc hasChanges] && ![moc save:&error]) {
            NSLog(@"MOC save error: %@, %@", error, [error userInfo]);
        } 
    }
}

Я вызываю этот метод из подклассов NSOperation и фоновых потоков и передаю экземпляр NSManagedObjectContext потока / NSOperation.

Мое беспокойство заключается в следующем:

Если поток A вызывает этот метод, и пока этот метод выполняется на полпути, поток B также вызывает его. С другим MOC конечно. Woul это мешать в любом случае? С моей точки зрения, это не так, потому что этот метод взаимодействует только с экземпляром MOC, который в любом случае является "частным" или "принадлежит" вызывающему потоку. Но меня раздражает то, что даже локальные переменные в методе «перепутаны», когда несколько потоков выполняют один и тот же кусок кода одновременно. Или каждая переменная имеет свой собственный «контекст» в новом потоке с собственной кучей (или, если на то пошло, стек) памяти?

Имеет ли большое значение, если я помещу этот код сохранения непосредственно в подклассы NSOperation и фоновые потоки? Почему?

Ответы [ 2 ]

3 голосов
/ 02 июня 2011

Почему бы вам не поставить блок @synchronize(...) вокруг операции сохранения.Это гарантирует, что контекст управляемого объекта не будет сохранен, если он уже сохраняется.

+ (void)saveContext:(NSManagedObjectContext*)moc {
    if (moc == nil) return;

    @synchronized(moc)
    {
        NSError *error = nil;
        if ([moc hasChanges] && ![moc save:&error])
            NSLog(@"MOC save error: %@, %@", error, [error userInfo]);
    } 
}

Чтение здесь при синхронизации.

2 голосов
/ 02 июня 2011

Правило состоит в том, что каждый поток должен иметь свой собственный moc.

Проверьте Руководство Apple для получения дополнительной информации.

...