Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Core Data ordering with a UITableView and NSOrderedSet

What are the steps that I need to perform to implement user-defined ordering in a UITableViewController with Core Data as the backing store?

Do I still need to respond to -tableView:moveRowAtIndexPath:fromIndexPath:toIndexPath: or is the model re-ordering handled automatically by the table view? Can I just check the "Ordered" checkbox in the Core Data model file and expect it to transmit the changes from the table view to the store, or do I have to do more? Do I have to change the way my fetchedResultsController gets it's objects (e.g. add a sort descriptor)?

like image 443
nevan king Avatar asked Mar 26 '12 16:03

nevan king


2 Answers

You don't need to abandon NSFetchedResultsController or NSOrderedSet. If you stick with NSOrderedSet, the easy way is to just add a method to your objects NSManagedObject subclass. So for instance, if you have an object Book with an ordered set of Chapters, you can add a method to the Chapters object:

- (NSUInteger)indexInBookChapters
{
    NSUInteger index = [self.book.chapters indexOfObject:self];
    return index;
}

Tip: Add this to a category so it doesn't get overwritten by CoreData auto generated code.

Then you can use this method in your sort descriptor for your NSFetchedResultsController:

fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"indexInBookChapters" ascending:YES]];
like image 81
Richard Venable Avatar answered Oct 05 '22 14:10

Richard Venable


The best practice here is to NOT use fetchedResultsController because it requires a sort descriptor, as you mentioned. You could use a dummy property but this is clearly not good practice. Instead, use objectAtIndex in tableView:cellForRowAtIndexPath: and reload the table data when you need to, perhaps using Key-Value Observing, though depending on your use case there may be simpler and less crash-prone approaches.

And yes, you will have to implement tableView:moveRowAtIndexPath:fromIndexPath:toIndexPath:

See also

NSFetchedResultsController and NSOrderedSet relationships

like image 44
Ilias Karim Avatar answered Oct 05 '22 13:10

Ilias Karim