2010-08-03 21 views
9

Desidero recuperare i dati dal mio NSFetchedResultsController utilizzando un predicato diverso che viene impostato utilizzando un valore booleano. Come posso aggiornare NSFetchedResultsController per recuperare un nuovo set di dati?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]; 
} 

}

che chiama

- (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; 
} 

risposta

28

Ecco come lo facciamo in un'applicazione:

// 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

Ho fatto questo ma quando richiamo la funzione, non esegue la nuova richiesta. (I miei predicati sono avvolti in se le istruzioni sono attivate con i booleani). –

+0

In realtà, hai ragione. Mi dispiace per quello Grazie mille per l'aiuto. –

+0

@corykilger, grazie! [NSFetchedResultsContrller deleteCacheWithName: cacheName]; era esattamente quello di cui avevo bisogno! – daveomcd

8

Non dimenticare di impostare fetchedResultsController = nil prima performFetch. Altrimenti userà quello vecchio.

-2

Ho avuto un problema simile, non riuscivo a capire perché la mia vista raccolta non aggiorna le sue celle. Aggiunta del metodo di seguito risolto i miei problemi.

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


}