Ich überarbeite ein bestehendes Projekt von Swift 2 nach Swift 3. Alles war einfach, bis ich Core Data refaktorieren musste. Ich kann verwaltete Objekte erstellen und sie in der managedObjectContext
beibehalten, aber ich habe Schwierigkeiten, NSFetchedResultsController
zu arbeiten. Ich schaute auf this post, aber es bringt mich nicht über die Ziellinie.Schwierigkeit beim Konfigurieren von NSFetchedResultsController in Swift 3
Nach Aufzeichnungen aus einem JSON importieren, überprüfen ich es Objekte in meinem managedObjectContext
mit dem folgenden Code:
func recordCount() -> Int {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "MyEntity")
let count = try! context.count(for: fetchRequest)
return count
}
Wenn ich eine fetchedResultsController
schaffen, ich bin in Schwierigkeiten laufen. Mein Code stürzt nicht ab, aber er gibt NSManagedObjects
nicht zurück, obwohl es Objekte gibt, die meiner Suche entsprechen.
Hier ist, wie ich meine NSFetchedResultsController
in einem UIViewController
erstellen.
class MyViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, NSFetchedResultsControllerDelegate {
// This is set on a prior viewController before segue.
// I've verified it's not nil
var selectedEquipmentString: String?
let managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
lazy var fetchedResultsController: NSFetchedResultsController<MyEntity> = {
// I've tried altering the syntax of the fetchRequest
// let fetchRequest: NSFetchRequest<MyEntity> = MyEntity.fetchRequest()
let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "MyEntity")
let sortDescriptor = NSSortDescriptor(key: "generalArea", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
fetchRequest.predicate = NSPredicate(format: "equipmentDescription == %@", self.selectedEquipmentString!)
let frc: NSFetchedResultsController<MyEntity> = NSFetchedResultsController(fetchRequest: fetchRequest as! NSFetchRequest<MyEntity>, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: "generalArea", cacheName: nil)
frc.delegate = self
return frc
}()
// MARK: - View Lifecycle Methods (abbreviated)
override func viewDidLoad() {
super.viewDidLoad()
// I've tried moving this call to viewWillAppear and viewDidAppear without success
fetchObjectsFromManagedObjectContext()
}
// MARK: - Core Data Methods (abbreviated)
func fetchObjectsFromManagedObjectContext() {
do {
try fetchedResultsController.performFetch()
} catch {
print("error: \(error)")
return
}
print ("There are \(fetchedResultsController.fetchedObjects!.count) returned from fetchObjectsFromManagedObjectContext")
}
}
Dieser Code stürzt nicht ab, gibt jedoch keine Datensätze von einer fetchRequest zurück. Ich konnte einen Crash mit einem Tippfehler im Prädikat erzwingen, aber ohne einen Tippfehler werden keine Objekte zurückgegeben, obwohl Objekte mit dem Prädikat übereinstimmen.
Ich begrüße alle Vorschläge re: wo mein Fehler ist. Ich kann beruhigt sein, ich weiß, dass es auf mich eine verblüffend dumme Kontrolle geben wird. Danke fürs Lesen.
Die offensichtliche Frage scheint zu sein, sind Sie sicher, dass Ihr Prädikat zu einem der Objekte passt, die Sie gespeichert haben? Ihre 'recordCount'-Methode verwendet nicht das Prädikat, aber Ihr abgerufener Ergebnis-Controller. Wenn also nichts mit dem Prädikat übereinstimmt, wird nichts gefunden. –
@TomHarrington Vielen Dank für das Lesen. Mein erster Gedanke war auch ein Problem mit dem Prädikat. Ich habe Arbeitscode aus dem Swift 2-Projekt in dieses Projekt kopiert (Aktualisierung der Syntax auf Swift 3), und ich habe die Attributnamen auf den verwalteten Objekten des Swift 3-Projekts beibehalten, was mich zu der Annahme verleitet hat, dass ich ein Problem mit der Konfiguration habe der FRC. – Adrian
Ja, aber wissen Sie etwas über die Daten, die Sie sicher stellen, dass einige der Objekte mit dem Prädikat übereinstimmen? Äquivalenter Code ist irrelevant, wenn nichts übereinstimmt. –