我在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,因为它绑定到上下文。
所以我不确定应该怎么做。有人可以帮忙吗?
答案 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];
这样就没有可以处理的块,而且你不必在后台队列上执行保存,因为即使在主线程上,这个单一记录更新也可能足够快。