2016-11-21 17 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

这是一个较新的和最新的最新的核心数据封装