2010-08-03 23 views
9

Quiero volver a buscar datos desde mi NSFetchedResultsController utilizando un predicado diferente que se establece utilizando un valor booleano. ¿Cómo actualizo NSFetchedResultsController para recuperar un nuevo conjunto de datos?NSFetchedResultsController refresh refetch?

- (void)refreshFetchedResultsController { 
    NSLog(@"refreshFetchedResultsController"); 

    NSError *error = nil; 
    if (![[self fetchedResultsController] performFetch:&error]) { 
     UIAlertView *alert = [[UIAlertView alloc] 
           initWithTitle:NSLocalizedString(@"Error loading data", 
                   @"Error loading data") 
           message:[NSString stringWithFormat: 



            NSLocalizedString(@"Error was: %@, quitting.", @"Error was: %@, quitting."), 
            [error localizedDescription]] 
          delegate:self 
          cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel") 
          otherButtonTitles:nil]; 
    [alert show]; 
} 

}

que exige

- (NSFetchedResultsController *)fetchedResultsController { 
    if (_fetchedResultsController != nil) { 
     NSLog(@"i was executed."); 
     return _fetchedResultsController; 
    } 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    TapAppDelegate *appDelegate = (TapAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Favorite" inManagedObjectContext:managedObjectContext]; 

    NSString *sectionKey = @"favname"; 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"favname" ascending:YES]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 


    if(showAll == NO){ 
     if(isXSelected == NO){ 
      NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isFirst == TRUE"]; 
      [fetchRequest setPredicate:predicate]; 
     } 

     if(isXSelected == YES){ 
      NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isFirst == FALSE"]; 
      [fetchRequest setPredicate:predicate]; 
     } 
    } 

    [fetchRequest setSortDescriptors:sortDescriptors]; 
    [fetchRequest setEntity:entity]; 
    [fetchRequest setFetchBatchSize:20]; 

    NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] 
             initWithFetchRequest:fetchRequest 
             managedObjectContext:managedObjectContext 
             sectionNameKeyPath:sectionKey 
             cacheName:nil]; 

    [sortDescriptor release]; 
    [sortDescriptors release]; 

    frc.delegate = self; 
    _fetchedResultsController = frc; 
    [fetchRequest release]; 
    return _fetchedResultsController; 
} 

Respuesta

28

Así es como lo hacemos en una aplicación:

// Assuming these exist 
NSPredicate * predicate; 
NSString * cacheName; 

[[fetchedResultsController fetchRequest] setPredicate:predicate]; 
[NSFetchedResultsController deleteCacheWithName:cacheName]; 

NSError * error = nil; 
[fetchedResultsController performFetch:&error]; 
if (error) { 
    // report error 
} 
+0

He hecho esto pero cuando recuerdo la función, no ejecuta la nueva solicitud. (Mis predicados están envueltos en sentencias activadas con booleanos). –

+0

En realidad, tienes razón. Lo siento por eso. Muchísimas gracias por la ayuda. –

+0

@corykilger, gracias! el [NSFetchedResultsContrller deleteCacheWithName: cacheName]; era exactamente lo que necesitaba! – daveomcd

8

No se olvide de establecer fetchedResultsController = nil antes performFetch. De lo contrario, usará el anterior.

-2

Tuve un problema similar, no pude entender por qué mi vista de colección no actualiza sus celdas. Agregar el método a continuación solucionó mis problemas.

-(void)didUpdateObjectAtIndexPath:(NSIndexPath *)indexPath{ 
    UICollectionView *strongCollectionView = self.collectionView; 
    [strongCollectionView reloadItemsAtIndexPaths:@[indexPath]]; 


}