Код:Основные данные не могут устранить ошибки, когда объект имеет атрибут «описание»?
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"A"
inManagedObjectContext:moc];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"somePredicate", someObject];
[fetchRequest setPredicate:predicate];
frc = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:moc
sectionNameKeyPath:@"recency"
cacheName:@"frc"];
[fetchRequest release];
frc.delegate = self;
NSError *error;
BOOL success = [frc performFetch:&error];
if (!success) {
NSLog(@"error: %@", error);
}
for (A *a in [frc fetchedObjects]) {
[someMutableArray addObject:a.b];
[someMutableArray addObject:a];
}
модель данных:
А и В являются сущностями. А имеет обязательное к одному отношению к B. B имеет обратное дополнительно ко многим отношения к А.
Выше на английском языке:
Инициализировать NSFetchedResultsController, чтобы захватить некоторые данные для питания TableView. После первоначальной выборки отложите данные для некоторой обработки.
Теперь, позже, я пытаюсь сделать это:
id object = [someMutableArray objectAtIndex:someIndex];
NSLog(@"%@", object);
if ([object isMemberOfClass:[B class]]) {
someVar = object.propertyFromB; // problem
} else if ([object isMemberOfClass:[A class]]) {
someVar = object.propertyFromA;
}
Вопрос/проблема: линия обозначена "проблемных" аварий. (EDIT: смотрите ниже разрешение, но все же хотел объяснения.)
Вызов NSLog выше, дает:
2010-01-30 14:47:14.433 app[22618:20b] <B: 0xf7f750> (entity: B; id: 0xf7ba70 <x-coredata://B01FEC86-14D6-4973-BFDB-EDE4AFD24FDC/B/p4> ; data: <fault>)
2010-01-30 14:47:14.438 app[22618:20b] <A: 0xf7e360> (entity: A; id: 0xf35820 <x-coredata://B01FEC86-14D6-4973-BFDB-EDE4AFD24FDC/A/p6> ; data: {
prop1 = value1;
prop2 = value2;
... etc ...
})
Ie по проблемному линии, если объект был типа А, это было неисправен и доступен в памяти, но если это B, это ошибка.
Мое понимание заключается в том, что строка «проблема» должна запускать ошибку и извлекать данные из хранилища, но этого не происходит. Я хотел бы понять/отладить почему. Я попытался вставить вызовы willAccessKey/didAccessKey вокруг этого. Я также попытался установить setRelationshipKeyPathsForPrefetching: «b» в запросе выборки. Ничего не сработало.
Моя гипотеза заключается в том, что, поскольку я несколько злоупотребляю результатами NSFetchedRequestController, механизм сбоев путается по пути и не приносит ошибку, когда это предполагается. Поэтому я предполагаю, что метод bruteforce должен был бы создать новый запрос ручной выборки для извлечения связанного объекта B в нужное время. Но есть ли лучший способ?
EDIT:
Проблема заключалась в том, что объект B имел свойство «описание», который я определил, но сталкивается со встроенным в имени NSObject в. Xcode всегда давал мне предупреждения, но я их игнорировал, потому что я думал, что внутреннее свойство/метод описания «description» используется только для сброса строк на консоль и т. П., А не для внутренней обработки.
Проблема исчезла после того, как я сделал новую версию своей модели, переименовав «описание» в нечто другое. Все сбои начали работать, как ожидалось.
Я не понимаю, однако, что происходит. Являются ли основные данные использующими метод «описания» объектов для некоторой внутренней самоанализа?
Это все имеет смысл, и я вообще стараюсь воздерживаться от переопределения таких «хорошо известных» методов. Мой плохой для того, чтобы не понять, насколько чувствительным является «описание». – Jaanus