2016-06-26 6 views
15

Ich kann nicht meine NSFetchedResultsController initialisiert in iOS 10 mit Swift 3 in CoreDataTableViewController von AECoreDataUI.Wie initialisiert man einen NSFetchedResultsController in iOS 10 Swift 3

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) 

Compiler beschwert sich, dass

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

Der Controller nun generischer Typ für eine schnelle verwendet, aber es ist der Entitätstyp nicht korrekt Folgern. Ich habe es explizit versucht:

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

Kein Glück.

Danke!

+0

es ist Ihre variable Erklärung. Sie können nicht 'var fetchedResultsController: NSFetchedResultsController?' Mehr verwenden, müssen Sie 'var fetchedResultsController verwenden: NSFetchedResultsController ?' – Sulthan

Antwort

24

NSFetchRequest ist jetzt eine generische. NSFetchedResultsController ist auch eine generische. Wenn daher Variablen deklarieren, müssen Sie eine allgemeine Erklärung verwenden, zB:

var fetchedResultsController: NSFetchedResultsController<NasaPicture>? 
+1

Mein View-Controller hat eine Oberklasse CoreDataCollectionViewController, der die FRC deklariert. Weil es wiederverwendet werden kann, kann ich das Frc nicht an einen bestimmten Typ binden, wenn es in der Oberklasse deklariert ist. Es sei denn, ich füge einen generischen Typparameter bei der Basisklasse hinzu? –

+1

Ok, das Problem war in meiner Basisklasse - ich musste einen Typparameter von T: NSFetchRequestResult hinzufügen, T verwenden, wo immer ich NSFetchRequestResult benutzte, und Unterklassen die Entity zur Verfügung stellen, die sie benutzen wollen. –

+2

@ JasonC.Howlin Können Sie speziell zeigen, was Sie getan haben? Ich habe einen Bär einer Zeit, die ein frz langsam deklariert, ein Prädikat, Sortierdeskriptoren, etc. spezifizierend. – Adrian

-1

einfach die Funktion aufrufen:

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

wenn wir Variable deklarieren müssen, dann müssen wir eine allgemeine Erklärung verwenden überprüfen Sie bitte das folgende Code für NSFetchedResultsController in schnellen 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() 
} 
Verwandte Themen