Yaman
Yaman

Reputation: 3991

ios - NSFetchResultsController error with sortDescriptors

I have a Table View Controller with a list of Formations handled by a fetchResultsController.

Here's how my core data entities looks like :

enter image description here

I try to sort my fetchResultsController by dateRangelike this :

// |fetchedResultsController| custom setter
- (NSFetchedResultsController *)fetchedResultsController {
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:self.fetchRequest managedObjectContext:self.mainManagedObjectContext sectionNameKeyPath:@"dateRange" cacheName:kFormationsFetchedCacheName];
    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;
}

// |fetchRequest| custom setter
- (NSFetchRequest *)fetchRequest {
    if (_fetchRequest != nil) {
        return _fetchRequest;
    }

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"student == %@", self.currentStudent];
    NSSortDescriptor *dateDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"dateRange" ascending:NO];
    NSSortDescriptor *nameDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:NO];

    _fetchRequest = [[NSFetchRequest alloc] initWithEntityName:kBSFormation];
    _fetchRequest.predicate = predicate;
    _fetchRequest.sortDescriptors = [NSArray arrayWithObjects: dateDescriptor, nameDescriptor, nil];

    return _fetchRequest;
}

Everything is fine when i try to add the very first Formation, but for the next ones, i have these errors:

2013-01-30 22:43:08.370 [7202:c07] -[BSDateRange compare:]: unrecognized selector sent to instance 0x81781a0

2013-01-30 22:43:08.371 [7202:c07] CoreData: error: Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  -[BSDateRange compare:]: unrecognized selector sent to instance 0x81781a0 with userInfo (null)

2013-01-30 22:43:08.372 [7202:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[BSDateRange compare:]: unrecognized selector sent to instance 0x81781a0'

If i comment this line : NSSortDescriptor *dateDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"dateRange" ascending:NO];, it's working but my table view is messy as the sectionNameKeyPath is set to dateRange

Someone is figuring out what's the problem here ? :/

Upvotes: 0

Views: 189

Answers (1)

Tom Harrington
Tom Harrington

Reputation: 70936

You're telling it to sort based on the dateRange relationship. But dateRange is a relationship to BSDateRange, and how does Core Data compare those? Should it use from, or maybe to, or some combination of those? You can't just tell it to sort on an object like that, because it's not obvious how sorting should work.

Instead, first figure out what sorting even means. Then modify your sort descriptor appropriately. For example if you decide that sorting depends on the from value, change the sort descriptor to use the key path to from:

NSSortDescriptor *dateDescriptor = [NSSortDescriptor
    sortDescriptorWithKey:@"dateRange.from"
    ascending:NO];

If you need to sort based on both from and to, use more than one sort descriptor.

Upvotes: 2

Related Questions