我应该如何在私有队列中正确管理完整的Core Data堆栈?

时间:2015-09-26 09:25:53

标签: ios multithreading core-data concurrency nsmanagedobjectcontext

我在我的应用中处理了两个完整的Core Data堆栈:

  • AppDelegate中默认提供的那个。
  • 我完全创建的第二个堆栈,以便在私有队列中执行NSManagedObject更新,以避免阻止UI。

我有一个班级来创建第二个"辅助"核心数据堆栈,我这样做:

class CoreDataStack: NSObject {

   class func getPrivateContext() -> NSManagedObjectContext {

       let bundle = NSBundle.mainBundle()
       let modelURL = bundle.URLForResource("MyApp", withExtension: "momd")
       let model = NSManagedObjectModel(contentsOfURL: modelURL!)!

       let psc = NSPersistentStoreCoordinator(managedObjectModel: model)

       let privateContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)
       privateContext.persistentStoreCoordinator = psc

       let documentsURL = CoreDataStack.applicationDocumentsDirectory()
       let storeURL = documentsURL.URLByAppendingPathComponent("MyApp.sqlite")

       let options = [NSMigratePersistentStoresAutomaticallyOption: true]

       var error: NSError? = nil
       let store: NSPersistentStore?
       do {
           store = try psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: options)
       } catch let error1 as NSError {
           error = error1
           store = nil
       }

       if store == nil {
           print("Error adding persistent store: \(error)")
           abort()
       }

       return privateContext
   }

   class func applicationDocumentsDirectory() -> NSURL {
       let fileManager = NSFileManager.defaultManager()
       let urls = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) 
       return urls[0]
   }

}

我首先需要确认/澄清一些观点:

A)创建一个完整的Core Data堆栈以便像我一样使用私有队列中的上下文是否合法/正确?

B)是否会创建与NSManagedObjectModel默认核心数据堆栈中使用的文件相同的资源和相同.sqlite文件中的新AppDelegate导致问题?

关于管理我拥有的两个上下文(AppDelegate中的默认值,让我们称之为mainContext,以及我在私有队列中创建的上下文,让我们调用它{ {1}}):

  • privateContext旨在在整个应用中显示mainContext信息。
  • NSManagedObject旨在用于调用Web服务以获取更新的数据,使用收到的信息创建新的privateContext,并将这些新对象与应用程序已有的对象进行比较。 / LI>

我对此的疑问是:

  1. 是否应始终通过致电NSManagedObjectprivateContext来使用performBlock?这是否包括所有相关操作,例如读取/插入performBlockAndWait对象,以及清除/保存它?
  2. privateContext应该与主队列/线程相关联,对吧?那么所有相关的操作都应该在主线程中执行......
  3. 考虑到mainContext有自己的完整核心数据堆栈...如果我保存其对象,它们是否会存储在与保存{{1}时相同的privateContext文件中}}?或者这样的文件会是某种方式"重复"?
  4. 如果.sqlite应该从其私有队列中保存数据,并且mainContext应该在主线程中使用,是否会导致任何问题从privateContext中获取从中保存的数据mainContext
  5. 我需要帮助来理解并正确管理我的应用中的mainContext并发性,我对所有这些持久性工作人员造成了混乱,我偶尔会发现似乎有效的操作错误。 ..非常感谢。

0 个答案:

没有答案