2011-09-15 12 views
18

Tengo una solicitud de recuperación definida en mi modelo de datos centrales llamada "RemainingGaneProjections". Quiero ejecutar esa solicitud de búsqueda y ordenar los resultados por uno de los atributos de la entidad. Mi código es el siguiente:Aplicación del descriptor de ordenamiento a NSFetchRequest creado a partir de la plantilla

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

Cuando trato de ejecutar este código se bloquea con el siguiente mensaje:

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

He confirmado en el depurador que ocurre este accidente cuando ejecuto el método setSortDescriptors en mi NSFetchRequest. No he podido averiguar por qué sucede esto.

¿Alguna explicación de lo que está sucediendo aquí? ¿Hay algún otro enfoque que debería utilizar al recuperar los datos que deben ordenarse?

Respuesta

35

Encontré la respuesta en la documentación de Apple de todos los lugares. Como mi solicitud de búsqueda no tiene parámetros de sustitución, utilicé el método fetchRequestTemplateForName en lugar de fetchRequestFromTemplateWithName. Como resultado, la guía de programación de Datos Básicos dice esto:

Si la plantilla no tiene variables de sustitución, debe:

  1. Uso fetchRequestFromTemplateWithName: substitutionVariables: y pasar nula como las variables argumento;
  2. Use fetchRequestTemplateForName: y copie el resultado. Si intenta utilizar la solicitud de recuperación devuelta por fetchRequestTemplateForName :, esto genera una excepción ("No se puede modificar una solicitud de recuperación con nombre en un modelo inmutable").

he modificado mi solicitud ha podido recuperar la inicialización de hacer esto:

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

y ahora todo funciona como se esperaba.

+0

Y supongo que también ha agregado un 'lanzamiento' correspondiente para 'projectionsRequest'. –

+12

No, estoy usando ARC para este proyecto;) –

Cuestiones relacionadas