Подтвердить что ты не робот

Применение дескриптора сортировки к NSFetchRequest, созданного из шаблона

У меня есть запрос на выборку, определенный в моей базовой модели данных под названием "RemainingGaneProjections". Я хочу выполнить этот запрос на выборку и отсортировать результаты по одному из атрибутов сущности. Мой код выглядит следующим образом:

NSFetchRequest *projectionsRequest = [model fetchRequestTemplateForName:@"RemainingGameProjections"];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"confidence" ascending:NO];
[projectionsRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];

Когда я пытаюсь выполнить этот код, он выдает сообщение со следующим сообщением:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Can't modify a named fetch request in an immutable model.'

Я подтвердил в отладчике, что этот сбой происходит, когда я выполняю метод setSortDescriptors на моем NSFetchRequest. Я не мог понять, почему это происходит.

Любые объяснения того, что здесь происходит? Есть ли другой подход, который я должен использовать при извлечении данных, которые необходимо отсортировать?

4b9b3361

Ответ 1

Я сам нашел ответ в документации Apple по всем местам. Поскольку мой запрос выборки не имеет параметров подстановки, я использовал метод fetchRequestTemplateForName вместо fetchRequestFromTemplateWithName. Как оказалось, руководство по программированию основных данных говорит следующее:

Если шаблон не имеет переменных подстановки, вы должны либо:

  • Использовать fetchRequestFromTemplateWithName: substitutionVariables: и передать nil как аргумент переменных;
  • Использовать fetchRequestTemplateForName: и скопируйте результат. Если вы попытаетесь использовать запрос на выборку, возвращенный fetchRequestTemplateForName:, это генерирует исключение ( "Can not изменить именованный запрос выборки в неизменяемой модели" ).

Я изменил инициализацию запроса на выборку, чтобы сделать это:

NSFetchRequest *projectionsRequest = [[model fetchRequestTemplateForName:@"RemainingGameProjections"] copy];

и теперь все работает так, как ожидалось.