Sort Descriptors Using NSFetchedResultsController - Swift

I have a UITableView from Core Data with an NSFetchedResultsController returning location objects. Sorting by default (and section headers) is done through the first letter of the object name. This works (although I'm still trying to combine upper and lower case in the same section correctly.) The user can choose to arrange the table according to one of three optional categories (which are attributes of the object), and then these categories are sorted by the name of the object.

When I set up sorting by category, I get the following runtime error:

 [_TtCSs23_ContiguousArrayStorage00007F80513B59D0 key]: unrecognized selector sent to instance 0x7f80513b5720 

This is my NSFetchedResultsController :

 var sectionNameKeyPathString1: String? var sectionNameKeyPathString2: String? var fetchedResultsController: NSFetchedResultsController { if _fetchedResultsController != nil { return _fetchedResultsController! } let fetchRequest = NSFetchRequest() // Edit the entity name as appropriate. let entity = NSEntityDescription.entityForName("Location", inManagedObjectContext: self.managedObjectContext!) fetchRequest.entity = entity // Set the batch size to a suitable number. fetchRequest.fetchBatchSize = 20 // Edit the sort key as appropriate. if sectionNameKeyPathString1 != nil { let sortDescriptor1 = NSSortDescriptor(key: sectionNameKeyPathString1!, ascending: true) let sortDescriptor2 = NSSortDescriptor(key: sectionNameKeyPathString2!, ascending: true) let sortDescriptors = [sortDescriptor1, sortDescriptor2] fetchRequest.sortDescriptors = [sortDescriptors] } else { let sortDescriptor = NSSortDescriptor(key: "locationName", ascending: true) fetchRequest.sortDescriptors = [sortDescriptor] } var sectionNameKeyPath: String if sectionNameKeyPathString1 == nil { sectionNameKeyPath = "firstLetterAsCap" } else { sectionNameKeyPath = sectionNameKeyPathString1! } // Edit the section name key path and cache name if appropriate. // nil for section name key path means "no sections". let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext!, sectionNameKeyPath: sectionNameKeyPath, cacheName: "Locations") aFetchedResultsController.delegate = self _fetchedResultsController = aFetchedResultsController var error: NSError? = nil if !_fetchedResultsController!.performFetch(&error) { // TODO: Handle this error // Replace this implementation with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. //println("Unresolved error \(error), \(error.userInfo)") abort() } return _fetchedResultsController! } 

Using breakpoints, I'm sure, for example, sectionNameKeyPathString1 = "category1" and sectionNameKeyPathString2 = "locationName", as well as this sectionNameKeyPath = "category1", so the key path matches the first sort descriptor.

It worked for me in Obj-C, but now I am pulling my hair out and am sure that I am suffering from blindness.

+5
source share
1 answer

Are you too much []?

  let sortDescriptors = [sortDescriptor1, sortDescriptor2] // <- an [NSSortDescriptor] fetchRequest.sortDescriptors = [sortDescriptors] // <- now an [[NSSortDescriptor]] 

should only be:

  fetchRequest.sortDescriptors = [sortDescriptor1, sortDescriptor2] 
+10
source

Source: https://habr.com/ru/post/1201888/


All Articles