使用MagicalRecord有效保存

时间:2014-04-06 19:56:50

标签: ios magicalrecord

我在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 个答案:

答案 0 :(得分: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];

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