2016-11-21 5 views
0

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

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

- (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. Как справиться с контекстом и сохранить их правильно?

+0

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

ответ

0

Есть несколько важных замечаний, чтобы понять с помощью CoreData:

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

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

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

Обычно я бы использовать данные методы:

[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait] 

И

[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreAndWait] 

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

Таким образом, он сохраняет весь контекст без необходимости выбора определенных объектов.

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

Что является более новым и уточненным основной оболочкой данных