如何在iOS 10 Swift 3中初始化NSFetchedResultsController

我无法让我的NSFetchedResultsController在iOS 10中使用Swift 3在AECoreDataUI的CoreDataTableViewController中初始化 。

 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<_>" 

控制器现在使用genericstypes为swift,但它不正确推断实体types。 我已经明确地尝试过:

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

也没有运气。

谢谢!

NSFetchRequest现在是一个通用的。 NSFetchedResultsController也是一个通用的。 因此,在声明variables时,你必须使用一个通用的声明,例如:

 var fetchedResultsController: NSFetchedResultsController<NasaPicture>? 

当我们需要声明variables,那么我们必须使用一个通用的声明,请检查下面的代码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() } 

只需调用该函数:

 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() }