0

Ich habe einige große Daten in meinem Core Data Store Wie kann ich diese Daten im Hintergrund Thread laden?Wie lade ich die Core Data im Hintergrund Thread

func connectionCoreData() { 
     let fetchRequest = NSFetchRequest<PersonalClass>(entityName: "PersonalBase") 
     let sortDescriptor = NSSortDescriptor(key: "personName", ascending: true) 
     fetchRequest.sortDescriptors = [sortDescriptor] 
     if let managerObjectContext = (UIApplication.shared.delegate as? AppDelegate)?.managedObjectContext { 
      fetchResultController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managerObjectContext, sectionNameKeyPath: nil, cacheName: nil) 
      fetchResultController.delegate = self 
      do { 
       try fetchResultController.performFetch() 
       personalArray = fetchResultController.fetchedObjects! 
       self.tableView.reloadData() 
      } catch { 
       print(error) 
      } 
     } 
    } 

ich brauche Kerndatenlast im Hintergrund-Thread hinzufügen und dann aktualisieren meine Tableview

Antwort

1

Zuerst sollten Sie daran setzen, dass ein managedObjectContext auf einem einzigen Thread ausgeführt wird. Und Sie sollten auf die geladenen Objekte in demselben Thread zugreifen/sie bearbeiten.

In Ihrem Fall interagieren Sie mit den Objekten, die Sie im Hauptthread laden werden. Zum Beispiel füllen die geladenen Datenbankobjekte eine tableView und dies sollte auf dem Haupt-Thread erfolgen. Dies zwingt den managedObjectContext zu MainContextType, der auf dem Hauptthread ausgeführt wird.

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/CoreData/Articles/cdConcurrency.html

Sie sollten die NSFetchedResultsController des Laufens auf dem Hauptthread keine Angst haben, weil sie die Objekte in den Reihen lädt. Sie verwenden den FetchedResults-Controller jedoch nicht so, wie er sollte. Sie sollten diese zwei Zeilen nicht in Ihrem Code haben.

personalArray = fetchResultController.fetchedObjects! 
self.tableView.reloadData() 

Sie sollten mit dieser Methode auf das geladene Objekt zugreifen fetchResultController .objectAtIndexPath(indexPath).

Dies ist ein Beispiel dafür, wie die NSFetchedResultsController

class ViewController: UITableViewController NSFetchedResultsControllerDelegate{ 

    lazy var fetchedResultsController: NSFetchedResultsController = { 
     let fetchRequest = ... //Create the fetch request 
     let sortDescriptor = ... //Create a sortDescriptor 
     let predicate = ...//Create the predicate if you want to filter the results 
     fetchRequest.predicate = predicate 

     let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: mainContext, sectionNameKeyPath: nil, cacheName: nil) 
     fetchedResultsController.delegate = self 
     return fetchedResultsController 
    }() 

    override fun viewDidLoad(){ 
     super.viewDidLoad() 
     do { 
      try self.fetchedResultsController.performFetch() 
     }catch { 
      print(error) 
     } 
    } 

    func controllerWillChangeContent(controller: NSFetchedResultsController) { 
     tableView.beginUpdates() 
    } 

    func controllerDidChangeContent(controller: NSFetchedResultsController) { 
     tableView.endUpdates() 
    } 

    func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { 
     switch (type) { 
     case .Insert: 
      if let indexPath = newIndexPath { 
       tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
      } 
      break; 
     case .Delete: 
      if let indexPath = indexPath { 
       tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
      } 
      break; 
     case .Update: 
      if let indexPath = indexPath { 
       tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) 
      } 
      break; 
     case .Move: 
      if let indexPath = indexPath, newIndexPath = newIndexPath { 
       tableView.moveRowAtIndexPath(indexPath, toIndexPath: newIndexPath) 
      } 
      break; 
     } 
    } 
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if let sections = fetchedResultsController.sections { 
      let sectionInfo = sections[section] 
      return sectionInfo.numberOfObjects 
     } 
     return 0 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let obj = fetchedResultsController.objectAtIndexPath(indexPath){ 
     .... 
    } 

} 
+0

dank verwenden, aber wenn ich die 32k Zeilen in Kerndaten (Laden der Basis in NSFetchedResultsController dauert einige Sekunden, und ich möchte Suche hinzufügen in diese Basis) und ich muss schneller die Kerndaten laden, was ich tun muss? kann ich mehr relationen zu den core-daten hinzufügen und versuchen, die basis über relationen nach gruppen zu laden, oder wird das auch noch dauern? – Skie

+0

Es hängt wirklich davon ab, was Sie versuchen ... Sie sollten versuchen, Ihre Abfragen zu optimieren. Verwenden Sie die Indexierung .. Aber den NSFetchedresultscontroller auf einen Hintergrundkontext zu setzen, ist ein Alptraum, weil es nicht so verwendet werden soll. – ELKA

Verwandte Themen