Применение дескриптора сортировки к NSFetchRequest, созданному из шаблона - PullRequest
19 голосов
/ 15 сентября 2011

В моей базовой модели данных определен запрос на выборку, который называется «RemainingGaneProjection». Я хочу выполнить этот запрос на выборку и отсортировать результаты по одному из атрибутов объекта. Мой код выглядит так:

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. Я не смог понять, почему это происходит.

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

Ответы [ 2 ]

37 голосов
/ 16 сентября 2011

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

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

  1. Использовать fetchRequestFromTemplateWithName: substitutionVariables:передать nil в качестве аргумента переменных;
  2. Используйте fetchRequestTemplateForName: и скопируйте результат.Если вы попытаетесь использовать запрос на выборку, возвращенный fetchRequestTemplateForName:, это создаст исключение («Невозможно изменить именованный запрос на выборку в неизменяемой модели»).

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

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

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

0 голосов
/ 22 июня 2018

Из документации Apple:

NSSortDescriptor * ageDescriptor = [[NSSortDescriptor alloc] initWithKey: @ "age" ascending: YES];

NSSortDescriptor * hireDateDescriptor = [[NSSortDescriptor alloc: initWith@ "hireDate" по возрастанию: ДА];

NSArray * sortDescriptors = @ [ageDescriptor, hireDateDescriptor];

NSArray * sortedArray = [employeeArray sortedArrayUsingDescriptors: sortDescriptors];

1011 *https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...