使用 MagicalRecord 有效保存

Posted

技术标签:

【中文标题】使用 MagicalRecord 有效保存【英文标题】:Effectively saving using MagicalRecord 【发布时间】:2014-04-06 19:56:50 【问题描述】:

我在我的 ios 应用中使用 MagicalRecord,但不确定正确的保存方式。

我的应用是关于聊天的,每次登录的用户收到消息,我都需要更新一个时间令牌。

现在我喜欢这样:

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext)

    User *currentUser = [User MR_findFirstByAttribute:@"id" 
                                            withValue:@(_CURRENT_USER_ID) 
                                            inContext:localContext];

    currentUser.lastChatMessageTimeToken = [NSDate date]; 
];

但是,我认为效率不高,因为一旦用户登录,他的id就确定了,而currentUser总是一样的。

我想我应该将 currentUser 缓存为实例变量,但找不到相应的 MagicalRecord 方法来执行。

另外,有人告诉我不要缓存 NSManagedObject,因为它绑定到上下文。

所以我不确定我应该做什么。有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

您在获取、更新和最后保存单个对象方面是正确的,效率不是很高。只要您知道它属于哪个上下文,您就可以保留对 currentUser 对象的引用。从那里开始,您的代码将如下所示;

currentUser = //from somewhere else, a property perhaps
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext)
    User *localUser = [currentUser MR_inContext:localContext];
    localUser.lastChatMessageTime = [NSDate date];
];

通过对象 ID 获取对象将比执行获取请求更快。但是,由于您只更改一个对象,我建议您只保存在当前线程上(只要上下文也在正确的线程上):

NSManagedObjectContext *context = //....
User *currentUser = //from somewhere, and create in the context

currentUser.lastChatMessageTime = [NSDate date];

[context MR_saveToPersistentStoreAndWait];

这样就没有要处理的块,并且您不必在后台队列上执行保存,因为即使在主线程上,这个单条记录更新也可能足够快。

【讨论】:

谢谢!你能告诉我 saveToPersistentStoreAndWait 和 saveOnlySelfAndWait 之间的区别吗?我试图在 [NSManagedObjectContext MR_defaultContext] 上调用它们,但后者似乎根本没有保存。 saveOnlySelfAndWait 就像名字所说的那样。这是关于与父母的嵌套上下文。如果只保存一个级别,则需要再次调用父级的 save 以将更改持久保存到磁盘(假设父级上下文连接到协调器) 我在这里遇到了一个非常相似的问题:***.com/questions/23768124/… 我的问题是关于 MR_inContext: 为刚刚创建的用户对象返回 nil。

以上是关于使用 MagicalRecord 有效保存的主要内容,如果未能解决你的问题,请参考以下文章

如何在objective-c中使用可可豆荚升级magic record sdk

MagicalRecord:后台保存

AFNetworking 2.0,使用 CoreData (MagicalRecord) 保存下载状态

使用 MagicalRecord 保存实体 - 还尝试保存不同的实体?

使用 MagicalRecord 在后台保存的设计策略

使用 MagicalRecord 从 JSON 中保存父子关系