INSPersistentContainer-Swift 1.0.3

INSPersistentContainer-Swift 1.0.3

测试已测试
Lang语言 SwiftSwift
许可证 MIT
Released最后发布2016年9月
SPM支持 SPM

Michal Zaborowski维护。



  • 作者
  • Michał Zaborowski

介绍

INSPersistentContainerMichał Zaborowskiinspace.io 编写

INSPersistentContainer

这是 iOS8+/macOS 10.10+ 的开源、100% API 兼容的 NSPersistentContainer 替代品

您想使用 NSPersistentContainer,但需要支持较旧的 iOS 版本?我创建了 INSPersistentContainer,它是 NSPersistentContainer 的直接替代品。我逆向工程了可以在 iOS10b1 中找到的 NSPersistentContainer。关于它的信息在 Apple 文档 中还不是很多,但我发现 Apple 有一份关于此类别的说明:“NSPersistentContainer 实例包括代表功能化的 Core Data 栈所需的所有对象,并为常见的模式提供便利方法和属性。”

INSPersistentContainer 还包含对 NSManagedObjectContext 中新方法的支持,如

/* Whether the context automatically merges changes saved to its parent. Setting this property to YES when the context is pinned to a non-current query generation is not supported.
*/
@property (nonatomic) BOOL automaticallyMergesChangesFromParent;

此外,我添加了对于自动获得永久 ID 的方法,这是常用的。

/**
 *  If the main context is not the parent of the background context, retrieving the object by ID will fail. The temporary ID only exists in the main context and not in the store. The background context therefore has no access to that ID. In that case, you will need to obtain a permanent object ID for the objects in the main context using the API obtainPermanentIDsForObjects(:error:) before you can retrieve them in the background context.
 */
@property (nonatomic) BOOL ins_automaticallyObtainPermanentIDsForInsertedObjects;

最后,我添加了一个自定义数据栈,它使用 automaticallyMergesChangesFromParent 和 automaticallyObtainPermanentIDsForInsertedObjects,这对于后台批量更新工作非常出色。

简单用法(与 NSPersistentContainer 相同)

- (INSPersistentContainer *)persistentContainer {
    // The persistent container for the application. This implementation creates and returns a container, having loaded the store for the application to it.
    @synchronized (self) {
        if (_persistentContainer == nil) {
            _persistentContainer = [[INSDataStackContainer alloc] initWithName:@"INSPersistentContainer"];
            [_persistentContainer loadPersistentStoresWithCompletionHandler:^(INSPersistentStoreDescription *storeDescription, NSError *error) {

                if (error != nil) {
                    NSLog(@"Unresolved error %@, %@", error, error.userInfo);
                    abort();
                }
            }];
        }
    }
    return _persistentContainer;
}
lazy var persistentContainer: INSPersistentContainer = {
    let stack = INSDataStackContainer(name: "INSPersistentContainer")
    stack.loadPersistentStoresWithCompletionHandler({ desc, error in
        if error != nil {
            print(error)
            abort()
        }
    })
    return stack
}()

后台保存

[self.persistentContainer performBackgroundTask:^(NSManagedObjectContext * context) {
    Entity *desc = (Entity *)[NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:context];
    desc.name = @"test";
    [context save:nil];
}];
persistentContainer.performBackgroundTask { context in
    let obj = NSEntityDescription.insertNewObjectForEntityForName("Entity", inManagedObjectContext: context) as! Entity
    obj.name = "test"
    _ = try? context.save()
}

联系方式

inese.io

Twitter

许可证

INSPersistentContainer 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。