使用全局受管对象上下文来支持并发
在阅读开发者文档时,我还没有找到答案。使用全局受管对象上下文来支持并发
当使用主要和专用队列上下文中Core Data
是它使用的是我可以在我的应用程序和我的应用程序的整个生命周期进入全球NSPrivateQueueConcurrencyType
和NSMainQueueConcurrencyType
环境好的呢?
或者,我应该每次创建新实例时需要使用NSManagedObjectContext
?我已经使用this documentation但它不回答这个问题。
在大多数情况下,目前的最佳做法是从NSPersistentContainer
开始。它的方法指向处理托管对象上下文的良好实践。
NSPersistentContainer
有一个属性viewContext
它使用主队列并发性。顾名思义,它可以直接与用户界面和主队列配合使用。对于这些情况使用此上下文。不要创建新的主队列上下文。
它也有一些方法可以通过newBackgroundContext()
和performBackgroundTask
在专用队列上进行后台工作。在大多数情况下,当你需要做后台工作时,你可以使用其中的任何一种,而不需要保留对长寿命背景上下文的引用。需要注意的是,由于它们使用不同的后台队列,因此一个后台上下文有可能与另一个后台上下文同时执行。如果在你的情况下这似乎是可能的,你可能想要坚持一个背景环境来避免这种可能性。否则,您的背景上下文可能需要合并对其他背景上下文进行的更改,这些背景上下文可能会变得很难看。
上述所有情况都有例外,但这是一个很好的起点。如果出于某种原因不适合您的应用程序,请回过头再详细说明原因。
这是否是苹果不再推荐的做背景核心数据的旧方法?我想要使用'NSPrivateQueueConcurrencyType'和'NSMainQueueConcurrencyType'。 –
如果使用'newBackgroundContext()'或'performBackgroundTask',则使用私有队列并发。 –
啊,明白了。这在iOS 10中是全新的。 –
我会建议你在不同的上下文中编写然后合并回去。
作为一个良好的做法,我可以推荐使用设置MagicalRecord。
具体而言,他们使用Default Context as a Child of a RootSavingContext。然后,所有写入到new context,然后合并到根上下文中。
通过这种方式,可以在主线程中使用默认上下文并获取适当的更新通知,例如,用于FetchedResultsController。
两者都很好。我有使用临时背景环境的良好经验,以及使用全局背景环境的糟糕经历。上下文并不昂贵,你不应该害怕根据需要创建和销毁它们。 –