OGCoreDataStack 0.6.0

OGCoreDataStack 0.6.0

测试已验证
Lang语言 Obj-CObjective C
许可证 MIT
发布最后发布2014年12月

Jesper 维护。



这是什么?

这是一个轻量级、多线程的 Core Data 栈。设计目标是易用性、编译时检查以及对一些常见用例的包装。

该库旨在涵盖大多数用例,倾向于约定优于配置,使您的生活更加轻松。如果您有一些特殊要求,例如复杂的多对象模型设置,那么这个库可能不适合您。对于更全面覆盖的解决方案,您可以查看 MagicalRecord

安装和设置

  1. 将其作为 pod 添加。
  2. 在 prefix.pch 中导入 OGCoreDataStackCore.h。
  3. 可选地,也可以导入 NSManagedObjectContext+OGCoreDataStackContexts.h 和 NSManagedObject+OGCoreDataStackUniqueId.h。

该库只有一个持久化存储协调器和一条持久化存储。它是延迟加载的。如果您需要自定义它,请在首次使用之前调用:

+ (void)og_setupWithStoreType:(NSString *)storeType options:(NSDictionary *)options;

不需要其他设置。它应该会自动检测您的管理对象模型(假设您有一个且只有一个)。

概念

以上下文为中心的设计

您可以使用上下文以多种方式。而不是强迫您使用一个或两个上下文(例如,一个用于更新 UI 的上下文和一个用于导入数据的上下文),它要求您根据需要创建上下文。您可以有几个长期存在的上下文,或者根据需要丢弃它们,或者根据需要混合使用。这取决于您。

值得注意的是,所有上下文都与持久化存储协调器直接相关。如果您需要保持其他上下文的更新,请使用:

- (void)og_observeSavesInContext:(NSManagedObjectContext *)context;

- (void)og_stopObservingSavesInContext:(NSManagedObjectContext *)context;

可选地,您还可以使用 Contexts 子规范,它为您提供两个上下文:一个用于主线程,另一个用于在后台运行的重型操作。

操作

通过管理对象子类上的类方法管理对象。

创建

要创建一个对象

MyManagedObjectClass* object = [MyManagedObjectClass og_createObjectInContext:context];

获取

要获取对象

NSArray* objects = [MyManagedObjectClass og_fetchWithRequest:^(NSFetchRequest *request) {

    // set filter predicate and sort descriptors here

} context:context];

计数

要计数对象

NSUInteger count = [MyManagedObjectClass og_countWithRequest:^(NSFetchRequest *request) {

    // set filter predicate here

} context:context];

删除

要删除对象,您可以直接操作或通过获取。

[myObject og_delete];

或者通过获取操作。

[MyManagedObjectClass og_deleteWithRequest:^(NSFetchRequest *request) {

    // set filter predicate here

} context:context];

批量更新(需要 iOS 8+)

要更新 objects 的属性值,无需将它们加载到内存中,使用

NSNumber* updatedObjectCount;

BOOL success = [MyManagedObjectClass og_updateWithRequest:^(NSBatchUpdateRequest* request) {

    // set filter predicate and resultType here, e.g

    request.resultType = NSUpdatedObjectsCountResultType;

} context:context result:&updatedObjectsCount];

异步获取(需要 iOS 8+)

为了异步获取 objects

NSPersistentStoreAsynchronousResult* result = [MyManagedObjectClass og_fetchAsynchronouslyWithRequest:^(NSFetchRequest* request) {

        // set filter predicate here

    } progressTotal:1 context:context completion:^(BOOL success, NSArray* objects, NSError* error) {

        if (success)
        {
            // do something the the objects
        }
        else
        {
            // check the error
        }
    }];

您可以检查操作的进度

NSProgress* progress = result.progress;

您可以取消操作

[result cancel];

唯一标识符

尽管 Core Data 不是一个关系型数据库,它经常被用来缓存来自此类数据库的数据。如果您想这样做,为每个对象提供一个 id 属性是有用的。为此,使用 UniqueId 子规范,并在您的 NSManagedObject 子类中重写

+ (NSString *)og_uniqueIdAttributeName;

返回用作 id 属性的属性名称。这允许您使用一些创建和获取对象的便利方法

MyObject* object = [MyObject og_objectWithUniqueId:@873 allowNil:YES context:context];

对于多个对象

NSArray* objects = [MyObject og_objectsWithUniqueIds:idArray allowNil:YES context:context];

如果 allowNil 为 NO,将创建不对应对象的任何 id 的对象。

销售对象

OGCoreDataStackVendor 是 NSFetchedResultsController 的装饰者,它有用于将其用作 UITableViews 和 UICollectionViews 数据源的子类。要使用 vendor 作为 UITableViewDataSource,使用 Vendor 子规范,并创建一个特定的 vendor 子类的实例

self.myVendor = [[OGTableViewManagedObjectVendor alloc] init];

[self.myVendor setEntity:EntityClass.class request:^(NSFetchRequest* request) {

    // sort and filter the entity here

} context:myUIContext sectionNameKeyPath:nil cacheName:nil];

self.myVendor.tableView = myTableView;
self.myVendor.vending = YES;

您仍然需要实现 UITableViewDataSource 协议,但使用 vendor 来追踪部分数、每部分的 objects 数量和通过 NSIndexPath 获取 objects。然后,vendor 会根据底层对象的更改更新您的 tableview。

备注

  • 如果您在生产代码中不禁用 Foundation 断言,可能会得到一些不必要的异常。
  • 使用 @import 关键字,因此启用模块。

文档

更具体的文档在头文件中。如果了解 Core Data 的基本概念,它真的很容易使用。查看 Apple 的文档