I am saving a transaction to a budget and I am trying to fire the didChangeObject delegate function when a new transaction is saved. For delete operation, it is getting called but not for insert.
I initialize my NSFetchedResultsController as shown below:
private func populateTransactions() {
let request = Transaction.fetchRequest()
request.predicate = NSPredicate(format: "budgetCategory = %@", budgetCategory)
request.sortDescriptors = [NSSortDescriptor(key: "dateCreated", ascending: false)]
fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: persistentContainer.viewContext, sectionNameKeyPath: nil, cacheName: nil)
fetchedResultsController.delegate = self
do {
try fetchedResultsController.performFetch()
} catch {
print(error)
}
}
My view controller is conforming to NSFetchedResultsControllerDelegate. Here is the implementation of didChange delegate function.
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
guard let indexPath = indexPath else { return }
switch type {
case .delete:
tableView.deleteRows(at: [indexPath], with: .automatic)
break
case .insert:
tableView.insertRows(at: [indexPath], with: .automatic)
break
case .move, update:
break
@unknown default:
print("default")
}
print("did change")
}
And finally, here is the saveTransaction function.
private func saveTransaction() {
guard let name = nameTextField.text, let amount = amountTextField.text else {
return
}
let transaction = Transaction(context: persistentContainer.viewContext)
transaction.name = name
transaction.amount = Double(amount)!
transaction.budgetCategory = budgetCategory
transaction.dateCreated = Date()
budgetCategory.addToTransactions(transaction)
do {
try persistentContainer.viewContext.save()
} catch {
}
}
Am I missing something. Why is didChange function not called when I insert a new transaction?