2016-09-22 5 views
2

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.

+0

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. –

+0

@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

+0

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. –

Antwort

3

Ihr NSFetchRequest sollte den Typ NSFetchRequest<MyEntity> haben, aber Sie geben NSFetchRequest<NSFetchRequestResult> an. Versuchen Sie, diese zu ändern und lassen Sie mich wissen, ob es oder nicht

0

hilft überprüfen Sie bitte das folgende Code für 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() 
} 
Verwandte Themen