DATAStack 帮助您减轻 Core Data 程序的样板代码。现在,您可以将 AppDelegate 中所有与 Core Data 相关的代码移除,并用 DATAStack 实例替换(ObjC,Swift)。
- 更简单的线程安全
- 在使用单元测试时,可以同步运行
- 无单例
- 开箱即支持 SQLite 和 InMemory
- 简单的数据库删除方法
- 与 Swift 紧密集成
- 兼容 Objective-C
- 免费
目录
运行演示
- 克隆仓库
- 打开
Demo.xcodeproj
- 享受吧!
初始化
您可以使用您的 Core Data 模型名称(xcdatamodel)轻松初始化一个新的 DATAStack 实例。
Swift
let dataStack = DATAStack(modelName:"MyAppModel")
Objective-C
DATAStack *dataStack = [[DATAStack alloc] initWithModelName:@"MyAppModel"];
有多种方法可以初始化 DATAStack
- 使用自定义存储类型。
let dataStack = DATAStack(modelName:"MyAppModel", storeType: .InMemory)
- 使用另一个包和一个存储类型,比如说你的测试包和.InMemory存储类型,非常适合运行单元测试。
let dataStack = DATAStack(modelName: "Model", bundle: NSBundle(forClass: Tests.self), storeType: .InMemory)
- 为你的.sqlite文件使用不同于你的模型名的名称,例如
CustomStoreName.sqlite
。
let dataStack = DATAStack(modelName: "Model", bundle: NSBundle.mainBundle(), storeType: .SQLite, storeName: "CustomStoreName")
- 提供不同的容器URL,默认情况下我们将使用文档文件夹,大多数应用程序都这样做,但如果你想在主应用程序和应用程序扩展之间共享sqlite文件,你将需要这个。
let dataStack = DATAStack(modelName: "Model", bundle: NSBundle.mainBundle(), storeType: .SQLite, storeName: "CustomStoreName", containerURL: sharedURL)
主线程 NSManagedObjectContext
通过使用 mainContext
属性,获取与主线程关联的 NSManagedObjectContext 与此非常简单。
self.dataStack.mainContext
或者
self.dataStack.viewContext
后台线程 NSManagedObjectContext
你可以轻松创建新的后台 NSManagedObjectContext 用于数据处理。此块完全异步,将在后台线程上运行。
为了与 NSPersistentContainer 兼容,你也可以使用 performBackgroundTask
而不是 performInNewBackgroundContext
。
Swift
func createUser() {
self.dataStack.performInNewBackgroundContext { backgroundContext in
let entity = NSEntityDescription.entityForName("User", inManagedObjectContext: backgroundContext)!
let object = NSManagedObject(entity: entity, insertIntoManagedObjectContext: backgroundContext)
object.setValue("Background", forKey: "name")
object.setValue(NSDate(), forKey: "createdDate")
try! backgroundContext.save()
}
}
Objective-C
- (void)createUser {
[self.dataStack performInNewBackgroundContext:^(NSManagedObjectContext * _Nonnull backgroundContext) {
NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:backgroundContext];
NSManagedObject *object = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:backgroundContext];
[object setValue:@"Background" forKey:@"name"];
[object setValue:[NSDate date] forKey:@"createdDate"];
[backgroundContext save:nil];
}];
}
当使用 Xcode 的 Objective-C 自动完成时,backgroundContext
参数名没有包括在内。请确保添加它。
清理
通过调用 drop
,删除.sqlite文件并重置你的 DATAStack 的状态非常简单。
Swift
self.dataStack.drop()
Objective-C
[self.dataStack forceDrop];
测试
DATAStack 专为单元测试优化,并在测试环境中同步运行。希望你现在不需要使用 fewer XCTestExpectations。
如果你的 Core Data 模型位于你的应用程序包中,可以创建一个使用内存存储的堆栈如下
Swift
let dataStack = DATAStack(modelName: "MyAppModel", bundle: NSBundle.mainBundle(), storeType: .InMemory)
Objective-C
DATAStack *dataStack = [[DATAStack alloc] initWithModelName:@"MyAppModel"
bundle:[NSBundle mainBundle]
storeType:DATAStackStoreTypeInMemory];
如果你的 Core Data 模型位于你的测试包中
Swift
let dataStack = DATAStack(modelName: "MyAppModel", bundle: NSBundle(forClass: Tests.self), storeType: .InMemory)
Objective-C
DATAStack *dataStack = [[DATAStack alloc] initWithModelName:@"MyAppModel"
bundle:[NSBundle bundleForClass:[self class]]
storeType:DATAStackStoreTypeInMemory];
(提示:也许您还没有找到最佳使用NSFetchedResultsController的方法,看看这里(链接)。)
迁移
如果由于迁移处理不当,DATAStack
无法创建您的持久协调器,则它将销毁您的数据并创建一个新的sqlite文件。对于这种情况下正常的Core Data行为是使您的应用在启动时崩溃。这很不好玩。
安装
您可以通过CocoaPods获取DATAStack。要安装它,只需在您的Podfile中添加以下行
use_frameworks!
pod 'DATAStack', '~> 6'
您也可以通过Carthage获取<强>DATAStack强>。要安装它,只需在您的Cartfile中添加以下行
github "SyncDB/DATAStack" ~> 6.0
做得好
如果有什么看起来很愚蠢,请创建一个友好且建设性的问题,得到您的反馈将很棒。
祝您愉快。
作者
埃尔维斯·努涅兹, @3lvis
许可
DATAStack可在MIT许可下获得。有关更多信息,请参阅LICENSE文件。