Как правильно сохранять обновления с MagicalRecord?

Я использую MagicalRecord и не могу понять, как сделать его стабильным и предсказуемым.

Когда мне нужно обновить какие-то сущности, я извлекаю их из БД, изменяю их в соответствии с логикой, после чего отправляю их в свой метод «Saver»:

- (void) saveEntities:(NSArray *)entities {
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
        for (Entity_class *entityElement in entities) {
           NSPredicate *entitySearchPredicate = [...] // Composing predicate
           Entity_class *foundEntity = [Entity_class MR_findFirstWithPredicate:entitySearchPredicate];
           foundEntity = entityElement;
        }
        [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
    } completion:^(BOOL contextDidSave, NSError *error) {
        // contextDidSave always equals NO. Sometimes changes get saved, but sometimes they don't             
    }];
}

Я пытался сохранить локальный контекст[localContext MR_saveToPersistentStoreAndWait] вместо стандартного, но он никогда не работал.

Я борюсь с этими контекстами вторую ночь, и просто у меня закончились варианты поискового запроса для Google. Как разобраться с контекстом и правильно его сохранить?

# iphone magicalrecord
Источник
  • 0
    Я только что попытался сохранить контекст объекта [entityElement.managedObjectContext MR_saveToPersistentStoreAndWait] и он работает. До сих пор не понимаю, почему saveWithBlock: так непредсказуемо сохраняет. И зачем вообще этот метод существует, если все, что мне нужно сделать, это сохранить контекст сущности?
Codelisting
за 0 против

Есть несколько важных замечаний, которые следует понимать при использовании CoreData:

  1. Вы должны сохранять, используя контекст, в котором была создана сущность. Это означает, что если сущности были созданы в другом потоке, они могли использовать другой контекст, и иногда это может вызывать сбои при наличии нескольких потоков и большого количества сохранений в секунду.

  2. Метод saveWithBlock предназначен для асинхронного сохранения, что означает, что он сохранит контекст, как только он будет готов (обычно сразу же), поэтому, если вы попытаетесь сразу проверить наличие изменений и получить данные, возможно, он еще не был сохранен.

Это поможет вам узнать больше о различиях в основных данных между разными контекстами - MainQueue и PrivateQueue.

Обычно я использую следующие методы:

[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]

А также

[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreAndWait]

Вы также можете использовать MR_saveToPersistentStoreWithCompletion: для асинхронного сохранения.

Таким образом, сохраняется весь контекст без необходимости выбора конкретных сущностей.

Если вы новичок, вы также можете проверить CoreDataStack

Это более поздняя и актуальная оболочка основных данных

Codelisting
Популярные категории
На заметку программисту