2016-05-03 15 views
0

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)") 
    } 

} 
+0

Wann wurde und wird der Nib/Storyboard-Controller instanziiert? – Wain

+0

@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

+0

Haben Sie das XIB kopiert oder neu erstellt? – Willeke

Antwort

1

das dynamic Schlüsselwort In dem Swift Eigenschaften KVO-konform zu machen.

dynamic var mainContext:NSManagedObjectContext!