Ошибка основных данных в NSArray - PullRequest
1 голос
/ 08 февраля 2012

У меня есть метод, который выполняет NSFetchRequest для получения массива управляемых объектов (в частности, XMPPUserCoreDataStorageObjects). Объекты правильно выдают ошибку, прежде чем массив будет возвращен executeUserFetch, и я смогу напечатать все displayNames, но как только я верну массив в printUserInfo, объекты перейдут в состояние ошибки, что не будет проблемой, за исключением того, что Core Data не принесет их обратно!

- (NSArray*)performUserFetch 
{
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
    [context setPersistentStoreCoordinator:[xmppRosterStorage persistentStoreCoordinator]];
    [context setUndoManager:nil];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPUserCoreDataStorageObject" inManagedObjectContext:context];

    NSSortDescriptor *sd1 = [[NSSortDescriptor alloc] initWithKey:@"sectionNum" ascending:YES];
    NSSortDescriptor *sd2 = [[NSSortDescriptor alloc] initWithKey:@"displayName" ascending:YES];

    NSArray *sortDescriptors = [NSArray arrayWithObjects:sd1, sd2, nil];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:entity];
    [fetchRequest setSortDescriptors:sortDescriptors];
    [fetchRequest setReturnsObjectsAsFaults:NO];
    NSError *err;

    NSArray *result = [context executeFetchRequest:fetchRequest error:&err];
    return result;

}

- (void)printUserInfo 
{
    NSArray *result = [self performUserFetch];
    for(XMPPUserCoreDataStorageObject *user in result)
    {
        NSString *dn = user.displayName;
        NSLog(@"Display name = %@", dn);
    }
        NSLog(@"%@",result);
}

Я вызываю printUserInfo каждые 5 секунд, и массив результатов, если все нормально, в executeUserFetch, но все в порядке в printUserInfo, и все элементы в массиве были удалены из памяти. Это было бы хорошо, но когда я вызываю user.displayName, ошибка не устраняется, поэтому dn имеет значение null, а описание пользователя -

"<XMPPUserCoreDataStorageObject: 0x10219fd60> (entity: XMPPUserCoreDataStorageObject; id: 0x1021a3390 <x-coredata://324B9E93-BAD1-42B4-B7DB-2A62CA69BA13/XMPPUserCoreDataStorageObject/p127> ; data: <fault>)"

Кто-нибудь может помочь?!

(информация: 10.7 SDK, printUserInfo вызывается каждые 5 секунд и работает в режиме ARC)

Ответы [ 2 ]

5 голосов
/ 09 февраля 2012

Просто угадай. Было бы многообещающе попробовать следующее

  1. Не воссоздайте контекст управляемого объекта каждый раз. Держите это как собственность вашего класса.
  2. Возможно, вам также следует выделить / инициализировать массив, чтобы убедиться, что память остается выделенной. Вы также можете использовать свойство.

Альтернативное решение, кстати, заключается в использовании NSFetchedResultsController. Он был разработан, чтобы быть особенно надежным и эффективным, когда дело доходит до неисправностей.

2 голосов
/ 09 февраля 2012

Управляемые объекты не сохраняют автоматически свой контекст. Когда -performUserFetch возвращается и context выходит из области видимости, контекст управляемого объекта является сборщиком мусора. Без контекста сами управляемые объекты бесполезны.

Сохраняйте контекст самостоятельно где-нибудь (как и предлагал Мунди) до тех пор, пока вам нужно использовать эти XMPPUserCoreDataStorageObject экземпляры.

...