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){
....
}
}
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
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