Search code examples
iosobjective-ccore-datansfetchedresultscontroller

NSFetchedResultsController crashing when creating it, objc_exception_throw


I am receiving a objc_exception_throw when creating my NSFetchedResultsController. I am relatively new to iOS programming so I am still getting the hang of debugging iOS crashes.

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
lazy var parentContext: NSManagedObjectContext? = {
    if let managedObjectContext = self.appDelegate.managedObjectContext {
        return managedObjectContext
    }
    else {
        return nil
    }
    }()

lazy var fetchedResultsController: NSFetchedResultsController = {
    let request = NSFetchRequest()
    let entity = NSEntityDescription.entityForName("GameDate", inManagedObjectContext: self.parentContext!)
    request.entity = entity
    let frc = NSFetchedResultsController(fetchRequest: request, managedObjectContext: self.parentContext!, sectionNameKeyPath: nil, cacheName: nil)
    frc.delegate = self
    return frc
}()

override func viewDidLoad() {
    super.viewDidLoad()
    performFetchFromDb()
    setupTableView()
}

I am getting the crash on this line:

let frc = NSFetchedResultsController(fetchRequest: request, managedObjectContext: self.parentContext!, sectionNameKeyPath: nil, cacheName: nil)

Does this crash have something to do with my context?


Solution

  • I was missing an NSSortDescriptor in my fetch request. This fixed it:

    lazy var fetchedResultsController: NSFetchedResultsController = {
        let request = NSFetchRequest()
    
        let entity = NSEntityDescription.entityForName("GameDate", inManagedObjectContext: self.parentContext!)
        request.entity = entity
    
        let gameTimeSort = NSSortDescriptor(key: "gameTime", ascending: false)
        request.sortDescriptors = [gameTimeSort]
    
        let frc = NSFetchedResultsController(fetchRequest: request, managedObjectContext: self.parentContext!, sectionNameKeyPath: nil, cacheName: nil)
        frc.delegate = self
        return frc
    }()