2016-04-22 5 views
0

Ich versuche, Core Data fest im Griff zu bekommen und zum größten Teil macht alles seit, insbesondere mit Kind/Eltern-Kontexte und Abrufergebnis-Controller. Ich bin jedoch irgendwie auf dem CoreDataStack festgefahren. Ich versuche, das Attribut 'Kontext' im Rest des Programms zu nennen. Ich kann den Kontext in meiner ersten Ansicht drucken, aber er scheint nicht in der ganzen App über die Navigationsleiste zu bestehen.ManagedObjectContext in CoreDataStack ist nach dem Auspacken null zurückgegeben

Dies ist CoreDataStack.swift

//exablishes the directory to be used for the stack in SQLite fashion 
private lazy var applicationDocumentsDirectory: NSURL = { 
    let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) 
    return urls[urls.count-1] 
}() 

//establishes the managed context by which managed objects interact in reading and writing 
lazy var context: NSManagedObjectContext = { 
    var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType) 
    managedObjectContext.persistentStoreCoordinator = self.psc 
    return managedObjectContext 
}() 

//establishes the coordinator that connects the managed context with the persistent store 
private lazy var psc: NSPersistentStoreCoordinator = { let coordinator = NSPersistentStoreCoordinator(
    managedObjectModel: self.managedObjectModel) 

    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent(self.modelName) 

    do { 
     let options = [NSMigratePersistentStoresAutomaticallyOption : true] 

     try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: options) //establishes the actual persistent store 
    } catch { 
     print("Error adding persistent store.") 
    } 
    return coordinator 
}() 
//establishes the object model that interacts with the GUI object data model 
private lazy var managedObjectModel: NSManagedObjectModel = { 
    let modelURL = NSBundle.mainBundle().URLForResource(self.modelName, withExtension: "momd")! 
    return NSManagedObjectModel(contentsOfURL: modelURL)! 
}() 

Und dies ist der entsprechende Abschnitt in AppDelegate.Swift

let navigationController = window!.rootViewController as! UINavigationController 
    let listViewController = navigationController.topViewController as! ViewController 
    listViewController.coreDataStack = coreDataStack 

Antwort

2

dies Ihr Problem nicht wirklich lösen, aber ich biete eine alternative Lösung. Ich sehe nichts falsch mit dem Code, den Sie zur Verfügung gestellt haben. Es wäre hilfreich zu sehen, wie Sie später versuchen, die CoreDataStack in anderen View-Controller zu bekommen, und warum Sie denken, dass es nicht weiter besteht.


ich meine CoreDataStack Klasse in der Regel nur eine Sammlung von statischen Methoden und Variablen machen.

ersetzen lazy mit static (alle statischen Vars automatisch faul sind) für alle Variablen auf Ihrem CoreDataStack. Dann, überall in Ihrer App möchten Sie Ihren Kontext verwenden:

let ctx = CoreDataStack.context; 
+0

Ich mag es. Simplistic und effizient – ggworean

+0

es wirft auch Fehler für Fälle, in denen ich "self .___" verwende. Soll ich einfach alle Instanzen von sich selbst entfernen? – ggworean

+0

@ggworean Yup! 'self' wird jetzt nicht verwendet, da alle Methoden und Variablen in' CoreDataStack' statisch sind. Sie sind jetzt Klassenvariablen anstelle von Instanzvariablen. Sie instanziieren CoreDataStack nicht mehr, Sie verwenden es stattdessen direkt. –

Verwandte Themen