NSFetchedResultsController, возвращающий ноль для indexPathForObject
У меня есть мой FetchedResultsController
(FRC) настроить так:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MTWMeeting" inManagedObjectContext:[NSManagedObjectContext MR_defaultContext]];
[fetchRequest setEntity:entity];
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"meetingDay.dayTimestamp" ascending:YES];
NSSortDescriptor *sort2 = [[NSSortDescriptor alloc] initWithKey:@"meetingTimestamp" ascending:YES];
[fetchRequest setSortDescriptors:@[sort, sort2]];
NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[NSManagedObjectContext MR_defaultContext] sectionNameKeyPath:@"meetingDay.dayTimestamp" cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;
Моя БД смертельно проста - у меня есть MTWMeeting
сущность и MTWDay
сущность, которая может иметь много встреч. Каждое собрание может иметь только 1 родительский день.
Моя таблица настроена с заголовками на 1 MTWDay
сущность за 1 секцию.
Теперь мне нужно перейти к определенному индексу в этой ячейке.
Я делаю это так:
MTWDay *targetDay = [MTWCoreDataManager suitableDayForMeetingWithTimestamp:[date timeIntervalSince1970]];
MTWMeeting *ourMeeting = [targetDay.dayMeetings anyObject];
NSIndexPath *ourPath = [self.fetchedResultsController indexPathForObject:ourMeeting];
NSIndexPath *tmpPath = [NSIndexPath indexPathForRow:0 inSection:ourPath.section];
Теперь, что бы я ни делал, ourPath
Путь индекса всегда nil
, Тем не мение, MTWDay
а также MTWMeeting
объекты - это реальные объекты Core Data, которые я получаю из основного стека данных.
Каковы мои шаги, чтобы выйти из этого поведения? Я боролся с этой проблемой в течение нескольких дней без каких-либо шансов.
РЕДАКТИРОВАТЬ:
Вот пример распечатки ourMeeting
Базовый объект данных, используемый в приведенном выше коде:
<MTWDay: 0x1742a8d00> (entity: MTWDay; id: 0xd000000001780008 <x-coredata://B0F694E1-7A45-4D1E-BB26-6F0A929A135D/MTWDay/p94> ; data: {
dayDisplayTitle = "\U0432\U043e\U0441\U043a\U0440\U0435\U0441\U0435\U043d\U044c\U0435";
dayEvents = "<relationship fault: 0x170230da0 'dayEvents'>";
dayID = nil;
dayMeetings = (
"0xd000000003440002 <x-coredata://B0F694E1-7A45-4D1E-BB26-6F0A929A135D/MTWMeeting/p209>"
);
dayNumericID = 16;
dayTimestamp = "1.416089e+09";
daysMonth = "0xd000000000140006 <x-coredata://B0F694E1-7A45-4D1E-BB26-6F0A929A135D/MTWMonth/p5>";
})
2 ответа
Контроллер выбранных результатов настроен без предикатов, поэтому он выбирает все собрания, поэтому рассматриваемое собрание должно быть в FRC. fetchedObjects
,
В рамках предоставленного кода вы можете проверить:
- является
targetDay
ноль? - является
targetDay.dayMeetings
пустойNSSet
? - это контроллер результатов выборки ноль?
- ты забыл позвонить
performFetch
на FRC? - Вы проверили, что контекст FRC совпадает с тем, из которого вы получаете объект?
- Вы получаете объект из того же контроллера извлеченных результатов, который используете для его размещения?
Вы выполнили выборку без ошибки?
NSError *error;
[self.fetchedResultsController performFetch:&error];
Если у вас есть, проверьте это ourMeeting
в self.fetchedResultsController.fetchedObjects