BGPersistentStoreManager
Core Data为Apple的iOS/macOS/watchOS等提供了许多用途,但需要一些初始设置、配置和理解以创建/保存/合并持久数据存储。
在此Pod中,Core Data自动配置为单例,提供对主上下文的访问(在主线程上读取/写入时)以及通过助手“块”函数方便地通过子上下文。为子上下文的助手块(主要用于从非主线程使用)将自动在调用它的线程上运行,因此您可以在任何线程上运行它,包括当前线程。
此Pod将在应用程序的“Caches”文件夹中创建数据库,因为Core Data有时会出错、迁移错误以及损坏。 BOOL
属性dataStoreWasResetOrCreatedOnLoad
的状态将在会话生命周期内保留,以便在会话期间从其他源恢复任何所需的永久本地数据。在许多情况(如果不是大多数情况)下,应将Core Data视为仅作为一种临时本地数据持久化方式,以便方便、速度快/优化以及离线功能,因为有可能因为用户设备损坏、磁盘空间不足和其他边缘情况而丢失数据。这种结构强制执行这种理念。
当应用程序进入后台或被用户终止时,持久存储将自动保存到磁盘。
用法
为了初始化托管对象上下文,请初始化单例
[BGPersistentStoreManager sharedManager];
可以从主线程访问managedObjectContext
,如下所示
[[BGPersistentStoreManager sharedManager] managedObjectContext];
由于Core Data不是线程安全的,请使用此块函数来创建和合并子上下文,从非主线程获取或进行更改
[[BGPersistentStoreManager sharedManager] performBlockOnChildContext:^(NSManagedObjectContext *context,
NSString *loggingDescriptor) {
// Your code goes here to fetch/insert/whatever you want. Use this "context" variable instead
// of the "managedObjectContext" property of the singleton.
}
withLoggingDescriptor:@"the fetching of objects"];
...为了方便,还将loggingDescriptor
传递给代码块,但主要是用来描述在后续合并子上下文过程中发生的任何错误,例如使用名词短语“获取照片对象”等。
其他有用的提示
- 如果您的数据库损坏或无法使用,它将被自动从磁盘删除,并使用最新版本的模型版本重新创建为全新的空数据库。在这种情况下,单例的
dataStoreWasResetOrCreatedOnLoad
属性将被设置为true
。 - 您可以通过子类化单例并利用实现其
cleanUpOldObjects:
方法来利用祂。该方法会在主上下文成功保存后(在应用程序后台或由用户终止应用程序时)在主线程上调用。然后,上下文将在此方法完成后再次重新保存,但只有当从第一次保存以来进行了任何更改时。 - 您还可以选择性地子类化其
handleSaveError:
方法,该方法会传递任何在保存主上下文过程中出现的错误。您可以在此处抛出异常,完全重置上下文或持久化存储,并/或将日志记录到远程日志服务。(例如)
安装
BGPersistentStoreManager
可通过CocoaPods
获得。要安装它,只需将以下行添加到您的Podfile
pod "BGPersistentStoreManager"
依赖项
此Cocoa Pod捆绑并依赖于KCOrderedAccessorFix
来自动修复“有序的,多对多关系的‘CoreDataGeneratedAccessors’”。
更多信息可以在这里找到:https://github.com/CFKevinRef/KCOrderedAccessorFix
作者
Ben Guild,[email protected]
许可
BGPersistentStoreManager
可在MIT许可下提供。有关更多信息,请参阅LICENSE文件。