微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

iOS 6处理托管对象后台保存的标准方法是什么(2013年)?

去年,我使用RestKit 0.10在后台无缝下载和保存核心数据对象.然而,当我在2013年尝试使用restkit时,我注意到他们已经取出了ActiveRecord模式,我依靠它来消除所有背景保存的不愉快.

我发现ActiveRecord模式存在于MagicalRecord框架中,但我能找到的大部分文档都是针对2.x版,而我的cocoapods安装了3.x.

我花了最近2个小时进行搜索,发现很多答案确实已经过时,不再适用于这些新框架.

这提出了一个问题:使用2013年提供的框架处理在后台保存核心数据对象的标准/最简单方法是什么?我应该尝试一些其他框架吗?

解决方法

如果您不使用任何外部库(如Magical Record或RestKit),只需使用所有手动内容,您就可以利用新的NSManagedobjectContext API.

您现在可以使用父子关系嵌套上下文,并且还可以告诉每个上下文在其自己的线程中执行块.因此,我的建议是为您的应用程序提供以下结构:

1)后台保存上下文.这将是直接向/从数据库保存和读取数据的唯一上下文.

2)在主线程上初始化的上下文,它将成为您在应用程序中需要执行的所有操作的访问点,尤其是更新UI.此上下文将是保存上下文的子项.

3)根据需要,您将创建在后台线程上执行工作的后台上下文,例如从网络加载数据并在NSManagedobject实例中序列化此数据.这个背景将是主要背景的孩子.

4)每次在上下文中调用 – [NSManagedobjectContext save:]时,你也应该在它的parentContext上调用相同的方法.要做到这一点,你可以在NSManagedobjectContext上的类别中有一个方便的方法,它读取如下内容

- (void)saveSelfAndParent {
    [self save:NULL];
    [self.parentContext performBlock:^{
        [self.parentContext saveSelfAndParent];
    }];
}

这已经是线程安全配置,您的更改会将更改传播到数据库.请注意,由于保存上下文没有父级(因此self.parentContext将为nil),performBlock:不会使应用程序崩溃.

下面是一个示例,假设您使用Grand Central dispatch(GCD)启动后台工作,您需要创建一个新实体:

dispatch_async(dispatch_async_get_global_queue(disPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
    NSManagedobjectContext *context = [[NSManagedobjectContext alloc] initWithConcurrencyType: nsprivateQueueConcurrencyType];
    context.parentContext = mainContext;

    // do some expensive job
    ...

    // initialize a new NSManagedobject instance using the information we calculated
    NSManagedobject *myObject = ...;

    // once we're done,let's save the context
    [context saveSelfAndParent];
});

请注意,我们使用私有队列并发类型(nsprivateQueueConcurrencyType)初始化上下文,该类型告诉上下文他是后台上下文.这非常重要!

就这样!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐