2014-04-06 3 views
1

Я использую 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

Вы верны в том, что выборка, затем обновление и, наконец, сохранение одного объекта не очень эффективны. Вы можете сохранить ссылку на свой объект 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]; 

Таким образом, нет никаких блоков, чтобы иметь дело с , и вам не нужно выполнять сохранение в фоновом режиме, так как это обновление одной записи, вероятно, будет достаточно быстрым даже в основном потоке.

+0

Спасибо! Можете ли вы сказать мне разницу между saveToPersistentStoreAndWait и saveOnlySelfAndWait? Я попытался вызвать их в [NSManagedObjectContext MR_defaultContext], но последний, похоже, не сохраняет вообще. – HanXu

+0

saveOnlySelfAndWait делает то, что говорит название. Это касается вложенных контекстов с родителями. Если вы сохраняете только один уровень, то вам нужно снова вызвать сохранение родителя, чтобы сохранить изменения на диске (при условии, что родительский контекст подключен к координатору) – casademora

+0

Спасибо, я получил его :) – HanXu

Смежные вопросы