CoreDataContextManager 0.1.3

CoreDataContextManager 0.1.3

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布上次发布2017 年 2 月

wagyu298 维护。



提供轻量级迁移和多线程的 CoreData 辅助工具。

功能

  • 自动应用基于 xcdatamodel 文件版本的轻量级迁移
  • 具有上下文管理的多线程
  • NSFetchedResultsControllerDelegate 的一般实现
  • 为 NSManagedObjectContext 提供有用的辅助类别方法

安装

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

FetchResultsControllerDelegate 的一般实现

CoreDataContextManager 包含了 FetchedResultsControllerDelegate 的一般实现。更多详情请参阅仓库中的示例应用。

NSManagedObjectContext 辅助方法

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;