Невозможно прочитать данные, используя NSManagedObjectContext - PullRequest
0 голосов
/ 01 марта 2012

Я пытаюсь прочитать массив из Core Data. Мой код выглядит следующим образом

-(NSArray *)getAges
{
    NSArray *fetchedObjects = [[NSArray alloc] init];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSManagedObjectContext *context = nil; 
    context = [[NSManagedObjectContext alloc] init];
    @try {
         NSPersistentStoreCoordinator *tempCordinator = (NSPersistentStoreCoordinator *)[(AppDelegate *)[[UIApplication sharedApplication] delegate] persistentStoreCoordinator];
            [context setPersistentStoreCoordinator:tempCordinator];

        NSError *error;
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Age" 
                                                  inManagedObjectContext:context];
        [fetchRequest setEntity:entity];
        fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
    }
    @catch (NSException *exception) {
        NSLog(@"core data exception occured.");
        fetchedObjects = nil;
    }
    [fetchRequest release];
    [context release];

    return fetchedObjects;
}

Теперь в основном потоке, в методе IBAction, я пишу следующую строку.

[NSThread detachNewThreadSelector:@selector(loadAgesMethod) toTarget:self withObject:nil];

Проблема в том, что этот метод возвращает мне массив из 20 элементов. Я могу видеть количество массивов 20, но в отладчике для каждого элемента массива я вижу «вне области видимости» и «сводка недоступна» И когда я пытаюсь получить любой объект из этого массива, я ничего не получаю. Следует упомянуть одну вещь: я вызываю этот метод getAges в loadAgesMethod из вторичного потока, как я упоминал выше. Это мое требование. Также, когда я пытаюсь получить этот массив из основного потока, я получаю все данные совершенно нормально.

Может кто-нибудь дать мне подсказку, где я не прав?

С наилучшими пожеланиями

1 Ответ

0 голосов
/ 27 апреля 2012

Каждый NSManagedObject имеет свойство NSManagedObjectContext. Это используется для ленивой выборки свойств объекта при необходимости в будущем. В конце этого метода вы вызываете [context release], поэтому NSManagedObjectContext будет освобожден, и все ваши свойства контекста NSManagedObject будут нулевыми для ваших объектов Age.

Вы можете вызвать [context autorelease] для контекста, чтобы он сохранялся в течение некоторого времени после метода и позволял извлекать свойства объектов на более поздней стадии. Обратите внимание, что это будет сохраняться только до тех пор, пока пул авто-релиза не истечет в конце цикла выполнения. Я все еще пытаюсь найти лучшее решение для многопоточной выборки.

...