adit
adit

Reputation: 33674

NSFetchResultsController delegate not getting called

I have the following code:

- (NSFetchedResultsController *)fetchedResultsController {
    // Set up the fetched results controller if needed.
    if (fetchedResultsController == nil) {

 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        // Edit the entity name as appropriate.
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"DiskStory" inManagedObjectContext:self.managedObjectContext];
        [fetchRequest setEntity:entity];

        fetchRequest.predicate = [NSPredicate predicateWithFormat:@"isRemoved == %@", [NSNumber numberWithBool:NO]];

        // Edit the sort key as appropriate.
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"created" ascending:NO];
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

        [fetchRequest setSortDescriptors:sortDescriptors];

        // Set limit
        [fetchRequest setFetchBatchSize:25];
        // Set batch size
        [fetchRequest setFetchLimit:50];


        NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:kSavedStoryCache];
        aFetchedResultsController.delegate = self;
        fetchedResultsController = aFetchedResultsController;
 }
    return fetchedResultsController;
}    

in my viewDidLoad I have:

 NSError *error = nil;
    if (![[self fetchedResultsController] performFetch:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    }

I was wondering why my :

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {

}

delegate, isn't called? I put a break point inside it. Any idea?

Upvotes: 1

Views: 3579

Answers (2)

Tomasz Zabłocki
Tomasz Zabłocki

Reputation: 1326

I had this problem before, it's not called when you call performFetch for the first time but only when data in fetchedResultsController is actually changed. For instance when you delete object from context that is in this fetch results, delegate will be called.

Upvotes: 3

user427969
user427969

Reputation: 3896

I think you have used self. at wrong places. Please see the code below; i have added comments to the changes

 - (NSFetchedResultsController *)fetchedResultsController {
    // Set up the fetched results controller if needed.
    if (fetchedResultsController == nil) {

        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        // Edit the entity name as appropriate.
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"DiskStory" inManagedObjectContext:self.managedObjectContext];
        [fetchRequest setEntity:entity];

        fetchRequest.predicate = [NSPredicate predicateWithFormat:@"isRemoved == %@", [NSNumber numberWithBool:NO]];

        // Edit the sort key as appropriate.
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"created" ascending:NO];
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

        [fetchRequest setSortDescriptors:sortDescriptors];

        // Set limit
        [fetchRequest setFetchBatchSize:25];
        // Set batch size
        [fetchRequest setFetchLimit:50];


        NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:kSavedStoryCache];
        aFetchedResultsController.delegate = self;
        fetchedResultsController = aFetchedResultsController;     // -> Shouldn't be self.fetchedResultsController 
 }
    return fetchedResultsController;        // -> Shouldn't be self.fetchedResultsController 
}   

Also, if you have synthesize your fetchedResultsController as follows:

fetchedResultsController = _fetchedResultsController 

Then in - (NSFetchedResultsController *)fetchedResultsController method you should refer to it as _fetchedResultsController

Upvotes: 0

Related Questions