HardCoreData:UI线程非阻塞CoreData栈和控制器
HardCoreData是基于Marcus Zarra 的多线程方法创建的 Core Data 栈,能够将写入到私有队列解耦,保持UI操作的流畅性。
HardCoreData由两个基本元素组成: HCDCoreDataStack 和 HCDCoreDataStackController。
HCDCoreDataStack
封装本地 CoreData 栈设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* Convenience initializers */ + (instancetype)binaryStackWithName:(NSString *)modelName; + (instancetype)inMemoryStackWithName:(NSString *)modelName; + (instancetype)sqliteStackWithName:(NSString *)modelName; + (instancetype)stackWithModelName:(NSString *)modelName storeType:(NSString *)storeType; /** * Designated initializer * * @param modelName NSString * @param storeType NSString * * @return HCDCoreDataStack */ - (instancetype)initWithModelName:(NSString *)modelName storeType:(NSString *)storeType NS_DESIGNATED_INITIALIZER; |
HCDCoreDataStack protocol
因为 HCDCoreDataStack 不仅是一个类,还是一个协议,所以你可以通过实现协议来创建自定义的栈。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@protocol HCDCoreDataStack <NSObject> @required /* Represents current store coordinator */ @property (nonatomic, strong, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; /* Represents currentm object model */ @property (nonatomic, strong, readonly) NSManagedObjectModel *managedObjectModel; /* Represents your single source of truth. Associated with main queue. */ @property (nonatomic, strong, readonly) NSManagedObjectContext *mainManagedObjectContext; @end |
HCDCoreDataStackController
创建子上下文与保存操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/** * Designated initializer * * @param stack HCDCoreDataStack * * @return HCDCoreDataStackController */ - (instancetype)initWithStack:(id <HCDCoreDataStack>)stack NS_DESIGNATED_INITIALIZER; /** * Instantiates new child context with given concurrency type.(使用给定的并发类型实例化新的子上下文) * You are responsive for retaining. */ - (NSManagedObjectContext *)createChildContextWithType:(NSManagedObjectContextConcurrencyType)type; /** * 保存主上下文(main context),并将更改(changes)推送到持久化保存。 * 执行时会保证线程安全 */ - (void)save; |
应用实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/* Create core data stack */ HCDCoreDataStack *stack = [HCDCoreDataStack sqliteStackWithName:@"Model"]; HCDCoreDataStackController *coreDataController = [HCDCoreDataStackController controllerWithStack:stack]; NSManagedObjectContext *backgroundContext = [coreDataController createChildContextWithType:NSPrivateQueueConcurrencyType]; [backgroundContext performBlock:^{ Person *person = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Person class]) inManagedObjectContext:backgroundContext]; person.firstName = @"John"; person.lastName = @"Doe"; /* 保存子上下文 */ [backgroundContext save:nil]; /* 将数据保存到持久化存储 */ [coreDataController save]; }]; |
使用
如果你想要运行示例工程,将仓库克隆到本地,然后在示例项目路径下运行 pod install 。
安装
可以通过CocoaPods安装 HardCoreData,只需在podfile中添加以下内容即可安装:
1 |
pod "HardCoreData" |
作者
Serg Krivoblotsky, krivoblotsky@me.com