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

Другие вопросы по тегам