2011-09-15 12 views
18

Mam żądanie pobierania zdefiniowane w moim głównym modelu danych o nazwie "RemainingGaneProjections". Chcę wykonać to żądanie pobierania i posortować wyniki według jednego z atrybutów jednostki. Mój kod wygląda następująco:Stosowanie deskryptora sortowania do NSFetchRequest utworzonego z szablonu

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

Kiedy próbuję wykonać ten kod to wywala się z następującym komunikatem:

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

Mam potwierdzoną w debugger, że ta katastrofa zdarza kiedy wykonać metodę setSortDescriptors na moim NSFetchRequest. Nie byłem w stanie zrozumieć, dlaczego tak się dzieje.

Jakieś wyjaśnienie tego, co się tutaj dzieje? Czy istnieje inne podejście, które powinienem stosować podczas pobierania danych, które należy posortować?

Odpowiedz

35

Sam znalazłem odpowiedź w dokumentacji Apple wszystkich miejsc. Ponieważ moje żądanie pobierania nie ma parametrów zastępowania, użyłem metody fetchRequestTemplateForName zamiast fetchRequestFromTemplateWithName. Jak się okazuje, przewodnik programowania Rdzeń danych mówi to:

Jeśli szablon nie posiada zmiennych podstawiania, musisz:

  1. Zastosowanie fetchRequestFromTemplateWithName: substitutionVariables: i przekazać nil jako zmienne argument;
  2. Użyj polecenia fetchRequestTemplateForName: i skopiuj wynik. Jeśli spróbujesz użyć żądania pobierania zwróconego przez fetchRequestTemplateForName :, generuje to wyjątek ("Nie można zmodyfikować nazwanego żądania pobierania w modelu niezmiennym").

zmodyfikowałem moje żądanie pobierania inicjalizacji Aby to zrobić:

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

i teraz wszystko działa zgodnie z oczekiwaniami.

+0

I zakładam, że dodałeś także odpowiednie "wydanie" dla 'projectionsRequest'. –

+12

Nie - używam ARC dla tego projektu;) –

Powiązane problemy