2011-08-26 19 views
14

Ejemplo he NSFetchedResultsController llamada en ListController llama FetchController¿Por qué no podemos cambiar FetchRequest en NSFetchedResultsController?

+(NSFetchRequest *)fetchRequestInContext: (NSString*) entityName : (NSPredicate *) predicate : (NSString*) sortKey : (BOOL) sortAscending; 

+(NSFetchedResultsController *) searchControllerInContext: (NSString*) entityName : (NSPredicate *) predicate : (NSString*) sortKey : (BOOL) sortAscending 
{ 
    NSFetchRequest *request = [self fetchRequestInContext:entityName :predicate :sortKey :sortAscending]; 

    NSFetchedResultsController * FRC=[[[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[ThreadClass managedObjectContext] sectionNameKeyPath:Nil cacheName:Nil]autorelease]; 
    NSLog(@"FRC : %@",FRC); 
    return FRC; 
} 

vistazo a ese código, que llamo searchControllerInContext cuando quiero hacer NSFetchedResultsController y luego perfom con este código:

if (![[self ListController].FetchController performFetch:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

el problema es No me gusta realizar siempreFetch cuando la solicitud es un cambio, quiero facilitarlo con

[self ListController].FetchController.fetchRequest=[self FunctionTogetNewRequest]; 

pero el [auto ListController] .FetchController.fetchRequest es de solo lectura ..

Quiero hacer esto porque no quiero ejecutar PerfomFetch una y otra vez ... ¿puedo hacer eso?

Quiero decir, si tengo un programa que da registros basados ​​en lo que el usuario pone en el cuadro de búsqueda, ¿debería crear un nuevo controlador cada vez que cambie el contenido del cuadro de búsqueda? Eso sería extraño. Pensé que el objetivo de utilizar NSFetchedResultsController es para que no tengamos que hacer eso.

Respuesta

23

Aunque fetchRequest es propiedad de solo lectura, puede modificarlo. Por ejemplo, establecer el predicado de la solicitud de recuperación funciona perfectamente siempre que no esté almacenando en caché los resultados (o siempre que elimine primero la memoria caché). He utilizado esta técnica con éxito en una serie de proyectos. Después de modificar la solicitud de búsqueda, debe llamar de nuevo al performFetch.

En pocas palabras: no es necesario crear un FRC cada vez que cambian los términos de búsqueda. Simplemente elimine su caché, cambie el predicado de la solicitud de búsqueda y busque el nuevo conjunto de resultados con su instancia existente.

+0

¿Qué pasará si guardo en caché el resultado? ¿Debo volver a llamar a performFetch si no guardo el resultado en caché? –

+0

Al modificar la solicitud de búsqueda, los resultados de la caché no serán válidos. Cada vez que modifique la solicitud de búsqueda, debe volver a buscar su conjunto de resultados. –

+3

Si bien esto puede funcionar, tenga en cuenta lo que Apple escribe en su documentación: 'IMPORTANTE No debe modificar fetchRequest después de invocar este método [NSFetchedResultsController init method]. Por ejemplo, no debe cambiar su predicado o los ordenamientos. – fabb

10

si tengo un programa que dé registros en función de lo que el usuario ponga en cuadro de búsqueda, debo crear un nuevo controlador cada vez que el cuadro de búsqueda cambio de contenido?

Sí, porque cambia el predicado en una búsqueda que requiere generar un nuevo controlador.

Pensé que el objetivo de utilizar NSFetchedResultsController es para que no tengamos que hacer eso?

El objetivo de un FRC es manejar automáticamente la interacción entre el contexto y la tabla vista. Tiene propiedades dedicadas para devolver secciones y filas, así como delegar métodos para modificar la tabla en respuesta a cambios en el modelo de datos. Como un FRC se define por su búsqueda, cuando realiza un cambio en la búsqueda, necesita generar un nuevo FRC

No cometa el error de pensar que un FRC tiene un objeto grande y caro. No es. No hay problema con la creación y eliminación de una gran cantidad de FRC según sea necesario.

Cuestiones relacionadas