NSFetchedResultsController refresh refetch?
12,553
Solution 1
Here's how we do it in an application:
// Assuming these exist
NSPredicate * predicate;
NSString * cacheName;
[[fetchedResultsController fetchRequest] setPredicate:predicate];
[NSFetchedResultsController deleteCacheWithName:cacheName];
NSError * error = nil;
[fetchedResultsController performFetch:&error];
if (error) {
// report error
}
Solution 2
Don't forget to set fetchedResultsController = nil before performFetch. Otherwise it will use the old one.
Author by
Oh Danny Boy
Updated on July 21, 2022Comments
-
Oh Danny Boy almost 2 years
I want to refetch data from my NSFetchedResultsController using a different predicate which is set using a boolean value. How do I refresh NSFetchedResultsController to fetch a new set of data?
- (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]; }
}
which calls
- (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; }
-
Oh Danny Boy over 13 yearsI have done this but when I recall the function, it does not execute the new request. (My predicates are wrapped in if statements triggered with booleans).
-
Oh Danny Boy over 13 yearsActually, you're right. Sorry about that. Thanks so much for the help.
-
daveomcd over 11 years@corykilger, thanks! the [NSFetchedResultsContrller deleteCacheWithName:cacheName]; was exactly what i needed!