Экземпляр NSFetchedResultsController требует не-nil Fetchrequest и managedObject контекста в iOS 10

Код работал хорошо, когда я использовал Xcode 7.3 с iOS 9, но когда я перешел на Xcode 8 с помощью swift 3, код ниже показывает мне, что ошибка во время выполнения. Все еще нахожу решение для этого

class TableViewController: UITableViewController,NSFetchedResultsControllerDelegate,UISearchResultsUpdating {
    var fetchResultController :NSFetchedResultsController<Restaurant>!
    var searchController : UISearchController!
    var searchResults :[Restaurant]  = []

    override func viewDidLoad() {
        super.viewDidLoad()

        let fetchRequest : NSFetchRequest<NSFetchRequestResult>  =  Restaurant.fetchRequest()
        let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)
        fetchRequest.sortDescriptors = [sortDescriptor]

        if let managedObjectContext = (UIApplication.shared.delegate as? AppDelegate)?.managedObjectContext{
            fetchResultController = NSFetchedResultsController(fetchRequest: fetchRequest as! NSFetchRequest<Restaurant>, managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)

            fetchResultController.delegate = self

            do{
                try fetchResultController.performFetch()
                restaurants = fetchResultController.fetchedObjects!
            }
            catch{
                print(error)
            }

        }
    }
}

2 ответа

  1. Попробовать это:

    — >Перейти к делегату приложения

    Введите это после последней скрученной скобки:

    let ad = UIApplication.shared.delegate as! AppDelegate
    let context = ad.persistenceContainer.viewContext
    

    — >Вернуться к TableViewController

    Удалить if let.

    Тип:

    var fetchResultController = NSFetchResultsController(
      fetchRequest: Your fetchRequest, 
      manageObjectContext: context (From the delegate), 
      sectionNameKeyPath: nil, cacheName: nil
    )
    self.fetchResultController = fetchResultController
    
  2. Из того, что я могу видеть из кода ниже, вы получаете объект ресторана

    var fetchResultController :NSFetchedResultsController<Restaurant>!
    var searchController : UISearchController!
    var searchResults :[Restaurant]  = []
    

    Но в fetchRequest вы определяете его как NSFetchRequestResult.

    let fetchRequest : NSFetchRequest<NSFetchRequestResult>  = Restaurant.fetchRequest()
    

    Это может быть NSFetchRequestResult, но я бы посоветовал вам бросить его прямо как ресторан. У меня была похожая проблема, и это сработало. Попробуйте это, и посмотреть, если это работает.

    let fetchRequest : NSFetchRequest<Restaurant>  = Restaurant.fetchRequest()