【问题标题】:Effectively saving using MagicalRecord使用 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,因为它绑定到上下文。

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

【问题讨论】:

    标签: ios magicalrecord


    【解决方案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 以将更改持久保存到磁盘(假设父级上下文连接到协调器)
    • 我在这里遇到了一个非常相似的问题:stackoverflow.com/questions/23768124/… 我的问题是关于 MR_inContext: 为刚刚创建的用户对象返回 nil。
    猜你喜欢
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    相关资源
    最近更新 更多