Применение дескриптора сортировки к 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. Я не мог понять, почему это происходит.
Любые объяснения того, что здесь происходит? Есть ли другой подход, который я должен использовать при извлечении данных, которые необходимо отсортировать?
Ответы
Ответ 1
Я сам нашел ответ в документации Apple по всем местам. Поскольку мой запрос выборки не имеет параметров подстановки, я использовал метод fetchRequestTemplateForName вместо fetchRequestFromTemplateWithName. Как оказалось, руководство по программированию основных данных говорит следующее:
Если шаблон не имеет переменных подстановки, вы должны либо:
- Использовать fetchRequestFromTemplateWithName: substitutionVariables: и передать nil как аргумент переменных;
- Использовать fetchRequestTemplateForName: и скопируйте результат. Если вы попытаетесь использовать запрос на выборку, возвращенный fetchRequestTemplateForName:, это генерирует исключение ( "Can not изменить именованный запрос выборки в неизменяемой модели" ).
Я изменил инициализацию запроса на выборку, чтобы сделать это:
NSFetchRequest *projectionsRequest = [[model fetchRequestTemplateForName:@"RemainingGameProjections"] copy];
и теперь все работает так, как ожидалось.