Как инициализировать NSFetchedResultsController в iOS 10 Swift 3

Я не могу инициализировать мой NSFetchedResultsController в iOS 10 с помощью Swift 3 в CoreDataTableViewController из AECoreDataUI.

let request = NSFetchRequest<NasaPicture>(entityName:"NasaPicture")  
request.predicate = Predicate(format: "isPagedResult == YES")  
request.sortDescriptors = [SortDescriptor(key: "date", ascending: false)]  
fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil)  

Компилятор жалуется, что

"Cannot convert value of type NSFetchedResultsController<NasaPicture> to expected type NSFetchedResultsController<_>"

Теперь контроллер использует общий тип для swift, но он не выводит тип сущности правильно. Я пробовал явно:

fetchedResultsController = NSFetchedResultsController<NasaPicture>(fetchRequest: request, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil)  

Не повезло.

Спасибо!

Ответы

Ответ 1

NSFetchRequest теперь является общим. NSFetchedResultsController также является общим. Поэтому при объявлении переменных вы должны использовать общее объявление, например:

var fetchedResultsController: NSFetchedResultsController<NasaPicture>?

Ответ 2

когда нам нужно объявить переменную, тогда мы должны использовать общее объявление проверьте ниже код для NSFetchedResultsController в swift 3..

 override func viewDidLoad() {
     super.viewDidLoad()
    do {
        try self.fetchedResultsController.performFetch()
    } catch {
        let fetchError = error as NSError
        print("Unable to Perform Fetch Request")
        print("\(fetchError), \(fetchError.localizedDescription)")
    }

}  //MARK: - NSFetchedResultsController

fileprivate lazy var fetchedResultsController: NSFetchedResultsController<UserExistenceOnXMPPCD> = {
    let fetchRequest = NSFetchRequest<UserExistenceOnXMPPCD>(entityName: "UserExistenceOnXMPPCD")
    fetchRequest.sortDescriptors = [
        NSSortDescriptor(key: "name", ascending: true)]

    let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext:CoreDataController.sharedInstance.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)

    try! fetchedResultsController.performFetch()
    fetchedResultsController.delegate = self
    if let quotes = fetchedResultsController.fetchedObjects {
        if quotes.count > 0 {
            print(quotes.count)
        }
    }
    return fetchedResultsController
}()


// MARK: - NSFetchedResultsController delegate methods
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>)  {
    tableView.beginUpdates()
}

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>)  {
    tableView.reloadData()
}

Ответ 3

Просто вызовите функцию:

private func setupFetchedResultsController() {

    let context = NSManagedObjectContext.mr_default()
    let fetchRequest = NSFetchRequest<Month>(entityName: "Month")
    let dateDescriptor = NSSortDescriptor(key: "date", ascending: false)

    fetchRequest.sortDescriptors = [dateDescriptor]

    fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: "year", cacheName: nil)
    fetchedResultsController.delegate = self

    try! fetchedResultsController.performFetch()
    tableView.reloadData()
}