Ich überschreibe meine vorherige objC-App in Swift 2.2. Dies ist eine Kakaoverwendung, bei der ich NSArrayController
verwende, um NSTableView
Inhalte zu füllen. Der Fehler ist offensichtlich, obwohl ähnliche Einrichtung in Objective-C-App funktioniert.Die Verwendung von arrayController führt dazu, dass "Ohne den Kontext eines verwalteten Objekts keine Operation ausgeführt werden kann"
Hier ist meine AppDelegate:
var coreStack:AP_CoreDataStack!
var mainContext:NSManagedObjectContext!
override func awakeFromNib() {
coreStack = AP_CoreDataStack(){ (result) ->() in
if result {
self.mainContext = self.coreStack.mainContext
}
}
}
Aufbau von Core Data-Stack
// MARK: - AP_CoreDataStack Class
class AP_CoreDataStack {
let mainContext: NSManagedObjectContext
let mastercontext: NSManagedObjectContext
var workerContext: NSManagedObjectContext?
internal typealias CallBack = (result:Bool) -> Void
init (callback: CallBack) {
let modelURL = NSBundle.mainBundle().URLForResource("appNameSWIFT", withExtension: "momd")
if (modelURL == nil) {
print("Failed to initialize modelURL: \(modelURL)")
}
let mom = NSManagedObjectModel(contentsOfURL: modelURL!)
if mom == nil {
print("Failed to initialize model")
}
let psc = NSPersistentStoreCoordinator(managedObjectModel: mom!)
mastercontext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
mastercontext.persistentStoreCoordinator = psc
mainContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
mainContext.parentContext = mastercontext
// add store to psc in background thread
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
//BACKGROUND THREAD
// adding store to persistent store coordinator
let options = [NSInferMappingModelAutomaticallyOption:true,
NSMigratePersistentStoresAutomaticallyOption:true]
do {
// store = try psc.addP
try psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: applicationDocumentDirectory(), options: options)
} catch let error as NSError {
print("Error: Failed to load store \(error.localizedDescription), \(error.userInfo)")
}
// MAIN THREAD
dispatch_async(dispatch_get_main_queue(), {() -> Void in
// On Main thread pass message that stack setup is complete
callback(result: true)
})
})
}
Obige ist die Swift-Version meines Obj C-Code, der gut funktioniert. Ich habe eine NSArrayController
in xib-Datei, die auf Entity
und NSManagedObjectContext
in IB gebunden ist:
// Bind To Delegate
self.mainContext
Es Array-Controller scheint mainContext zugreift, bevor es initialisiert wird, aber dies ist das gleiche Setup, die in ObjC gearbeitet, also warum es verursacht einen Fehler in Swift.
EDIT: Ich verwende reguläre XIB-Datei.
EDIT 2:
Offensichtlich mainContext ist nicht gleich Null, da es hier Aufruf richtig funktioniert
func applicationDidFinishLaunching(aNotification: NSNotification) {
// Insert code here to initialize your application
let request = NSFetchRequest(entityName: "AP_EntityA")
let list:Array<AnyObject>
do {
list = try coreStack.mainContext.executeFetchRequest(request)
for item in list {
let product = item as! AP_EntityA
print("item name is: \(product.uniqueName)")
}
} catch let error as NSError {
// failure
print("Fetch failed: \(error.localizedDescription)")
}
}
Wann wurde und wird der Nib/Storyboard-Controller instanziiert? – Wain
@Wain, verwende ich reguläre XIB-Datei, wo Sie ein NSWindow erhalten. Es wird instanziiert, wenn die App geladen wird. Ich erstelle keine zusätzlichen View-Controller-Objekte. – Khundragpan
Haben Sie das XIB kopiert oder neu erstellt? – Willeke