2017-02-02 1 views
1

Ich bin ein NSFetchedResultsController mit einem fetchRequest einer abstrakten Klasse instanziieren:Instanziieren NSFetchedResultsController mit abgefangene Ausnahme beendet

private func setupFetchController() { 
    let fetchRequest : NSFetchRequest<NSFetchRequestResult> = SearchEntity.fetchRequest() 
    let fetchController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil) 
    self.fetchController = fetchController 
} 

Die SearchEntity ist eine abstrakte Superklasse von Person und Group. Ich benutzte dies, um 2 Entitäten mit 1 NSFetchedResultsController abrufen zu können. Doch die App stürzt ab, wenn diese Funktion aufgerufen wird:

libC++ abi.dylib: mit abgefangene Ausnahme vom Typ NSException Abschluss

Ich habe es verengt Auskommentierung nach unten und kommentieren die Schaffung des NSFetchedResultsController . Ich habe 2 weitere dieser Funktionen mit genau dem gleichen Stil, der funktioniert.

Was mache ich/geht es schief?

edit: zu Hinzufügen. Ich bin in der Lage, die SearchEntity manuell zu holen, indem ich einfach context.performFetch(...) benutze, die mir korrekte Ergebnisse gibt. Daher werde ich den Namen suchen, also muss ich in der Lage sein, effizient zu aktualisieren.

edit2:

Beispiel für gleiche Funktion an anderer Stelle, die funktioniert:

private func setupFetchController() { 
    let fetchRequest : NSFetchRequest<NSFetchRequestResult> = Person.fetchRequest() 

    // Sort Persons 
    let sortDescriptor = NSSortDescriptor(key: "firstName", ascending: true) 
    let sortDescriptor2 = NSSortDescriptor(key: "lastName", ascending: true) 
    fetchRequest.sortDescriptors = [sortDescriptor, sortDescriptor2] 

    // Filter Persons (only iType = 1) 
    let predicate = NSPredicate(format: "iType == %i", 1) 
    fetchRequest.predicate = predicate 

    // Create the FetchController 
    let fetchController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: "sectionName", cacheName: nil) 
    self.fetchController = fetchController 
} 
+0

Sie haben gesagt: "Ich habe 2 weitere dieser Funktionen mit genau dem gleichen Stil, die funktionieren." Was meinst du? Und beide Funktionen sind vom selben Typ? Ich meine, sie sind FRC-Funktionen? – Mannopson

+0

Ich werde sie dem OP hinzufügen, sie instanziieren auch einen FetchResultsController, aber mit einer anderen Entität. – Emptyless

+0

Der einzige Unterschied ist nicht hinzufügen sortDescriptors/Prädikate – Emptyless

Antwort

4

Sie die Ausnahme, weil mindestens eine Art Descriptor erforderlich ist.

Vom documentation:

Sie normalerweise eine Instanz von NSFetchedResultsController als Instanzvariable einer Tabelle View-Controller erstellen. Wenn Sie den Abrufergebnis-Controller initialisieren, geben Sie vier Parameter an:

1) Eine Abrufanforderung. Diese muss mindestens einen Sortierungsdeskriptor zu enthalten, um die Ergebnisse zu bestellen.

2) Ein verwalteter Objektkontext. Der Controller verwendet diesen Kontext, um die Abrufanforderung auszuführen.

3) Optional ein Schlüsselpfad für Ergebnisobjekte, der den Namen des Abschnitts zurückgibt. Der Controller verwendet den Schlüsselpfad, um die Ergebnisse in Abschnitte aufzuteilen (die Übergabe von nil gibt an, dass der Controller einen Einzelabschnitt generieren soll).

4) Optional der Name der Cachedatei, die der Controller verwenden soll (Übergeben nil verhindert Caching). Durch die Verwendung eines Caches kann der Overhead der Berechnung der Abschnitts- und Indexinformationen vermieden werden.

Verwandte Themen