提供轻量级迁移和多线程的 CoreData 辅助工具。
CoreDataContextManager 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod "CoreDataContextManager"
MIT
将 CDMCoreDataContextManager 添加到您的 AppDelegate 类中,并在 [application:didFinishLaunchingWithOptions:]
方法中对其进行初始化。如果您已经使用 Xcode 默认模板启用了 CoreData,请在使用 CoreDataContextManager 之前删除整个代码。
@import CoreDataContextManager;
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (nonnull, strong, nonatomic) UIWindow *window;
@property (nonnull, strong, nonatomic) CDMCoreDataContextManager *coreDataContextManager;
@property (nonnull, strong, nonatomic, readonly) NSManagedObjectContext *managedObjectContext;
@end
您应该在构造函数方法 [[CDMCoreDataContextManager alloc] initWithSQLiteDatabaseName:]
中传递一个模型文件名前缀。如果您创建了一个名为 MyDatabase.xcdatamodeld
的模型文件,调用该方法的代码如下:[[CDMCoreDataContextManager alloc] initWithSQLiteDatabaseName:@"MyDatabase"]
。
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.coreDataContextManager = [[CoreDataContextManager alloc] initWithSQLiteDatabaseName:@"MyDatabase"];
return YES;
}
- (NSManagedObjectContext * _Nonnull)managedObjectContext {
return self.coreDataContextManager.managedObjectContext;
}
@end
之后,您可以使用以下代码获取 NSManagedObjectContext。
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectContext *moc = appDelegate.managedObjectContext;
CoreDataContextManager 提供一些类型构造函数,用于使用 SQLite、二进制或内存类型数据库进行初始化。
// SQLite database
- (instancetype _Nonnull)initWithSQLiteDatabaseName:(NSString * _Nonnull)databaseName autoSave:(BOOL)autoSave;
- (instancetype _Nonnull)initWithSQLiteDatabaseName:(NSString * _Nonnull)databaseName;
// Binary database
- (instancetype _Nonnull)initWithBinaryDatabaseName:(NSString * _Nonnull)databaseName autoSave:(BOOL)autoSave;
- (instancetype _Nonnull)initWithBinaryDatabaseName:(NSString * _Nonnull)databaseName;
// InMemory database
- (instancetype _Nonnull)initWithInMemoryDatabaseName:(NSString * _Nonnull)databaseName autoSave:(BOOL)autoSave;
- (instancetype _Nonnull)initWithInMemoryDatabaseName:(NSString * _Nonnull)databaseName;
// Constructor with specified store type, such as NSSQLiteStoreType
- (instancetype _Nonnull)initWithStoreType:(NSString * _Nonnull)storeType databaseName:(NSString * _Nonnull)databaseName autoSave:(BOOL)autoSave;
- (instancetype _Nonnull)initWithStoreType:(NSString * _Nonnull)storeType databaseName:(NSString * _Nonnull)databaseName;
如果您想对初始化应用更多定制,请使用 CDMCoreDataContextManagerConfiguration 类和 initWithConfiguration 构造函数。请参阅 CDMCoreDataContextManagerConfiguration 源代码以获取更多详细信息。
- (instancetype _Nonnull)initWithConfiguration:(CDMCoreDataContextManagerConfiguration * _Nonnull)configuration;
CoreDataContextManager 可自动将您的 xcdatamodeld 文件更改应用为 CoreData 轻量级迁移。要迁移数据库,添加新模型版本到您的 App。您可以从 Xcode 菜单 编辑 -> 添加模型版本...
中添加模型版本。
您可以使用 [coreDataContextManager createBackgroundContext]
方法创建后台线程的 NSManagedObjectContext。
NSManagedObjectContext *managedObjectContext = [self.coreDataContextManager createBackgroundContext];
[managedObjectContext performBlock:^{
// This block run in none-UI thread
NSError *error = nil;
if (![managedObjectContext save:&error]) {
NSLog(@"%@", error);
}
}];
[managedObjectContext save:]
将触发带有主上下文的 mergeChangesFromContextDidSaveNotification。CoreDataContextManager 对象观察 NSManagedObjectContextDidSaveNotification 通知并将来自后台线程的更改合并到数据库中。(在后台线程中执行 [managedObjectContext save:] 之后,您不需要做任何事情。)
CoreDataContextManager 在您的 App 将失去活跃状态(发布 UIApplicationWillResignActiveNotification 通知)时自动保存未提交的更改操作。
要禁用此功能,请在构造函数中以 autoSave:NO
参数调用。
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.coreDataContextManager = [[CoreDataContextManager alloc] initWithSQLiteDatabaseName:@"MyDatabase" autoSave:NO];
return YES;
}
@end
CoreDataContextManager 包含了 FetchedResultsControllerDelegate 的一般实现。更多详情请参阅仓库中的示例应用。
CoreDataContextManager 增加了 NSManagedObjectContext (CoreDataContextManager)
分类。该分类包含以下方法。
// Create managed object context for background thread.
// It is same as [CoreDataContextManager createBackgroundContext] if
// you call for CoreDataContextManager's managedObjectContext property,
// otherwise returing NSManagedObjectContext is setup for background thread
// and child of `this` NSManagedObjectContext but you should observe
// NSManagedObjectContextDidSaveNotification and import updates from
// the background thread by mergeChangesFromContextDidSaveNotification method.
- (NSManagedObjectContext * _Nonnull)cdm_createBackgroundContext;
// Save if NSManagedObjectContext has changed
- (BOOL)cdm_saveChanges:(NSError * _Nullable * _Nullable)error;
// Delete all entity objects
- (BOOL)cdm_deleteWithEntityName:(NSString * _Nonnull)entityName error:(NSError * _Nullable * _Nullable)error;