2016-04-22 3 views
0

私は、コアデータを堅固に把握しようとしており、大部分が子/親コンテキストとフェッチ結果コントローラを使用しています。しかし、私はCoreDataStackについています。私は、プログラムの残りの部分で属性 'context'を呼び出そうとしています。私は最初のビューでコンテキストを印刷することはできますが、ナビゲーションバーを介してアプリ全体に持続しているようには見えません。アンラッピング後にCoreDataStack内のManagedObjectContextが返されない

これは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)! 
}() 

であり、これはこれは本当にあなたの問題を解決していませんが、私は別のソリューションを提供AppDelegate.Swift

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

答えて

2

の関連するセクションです。あなたが提供したコードに間違いはありません。後で他のビューコントローラでCoreDataStackを取得しようとすると、それが永続していないと思われる理由を確認すると役に立ちます。


通常、私のCoreDataStackクラスは静的メソッドと変数のコレクションに過ぎません。

CoreDataStackのすべての変数に対してlazystatic(すべての静的変数が自動的に遅延します)に置き換えます。アプリ内でコンテキストを使いたい場所:

let ctx = CoreDataStack.context; 
+0

私はそれが好きです。シンプルで効率的な – ggworean

+0

私は "self .___"を使う場合にもエラーを投げます。私は単に自分のインスタンスもすべて削除する必要がありますか? – ggworean

+0

@ggworean Yup! 'self'は' CoreDataStack'のメソッドと変数のすべてが静的なので使用されません。それらはインスタンス変数ではなくクラス変数です。あなたはもはや 'CoreDataStack'をインスタンス化せず、代わりに直接使用します。 –

関連する問題