如何使用MagicalRecord正确保存更新?

时间:2016-11-21 01:28:53

标签: ios objective-c iphone magicalrecord

我使用的是MagicalRecord,我无法理解如何使其工作稳定且可预测。

当我需要更新某些实体时,我会从DB中检索它们,根据逻辑更改它们,之后我将它们发送到我的“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的搜索查询变体。如何处理上下文并妥善保存?

1 个答案:

答案 0 :(得分:0)

使用CoreData需要了解一些重要注意事项:

  1. 您必须使用创建实体的上下文进行保存。 这意味着,如果实体是在不同的线程上创建的,那么它们可能正在使用不同的上下文,有时当有多个线程和大量的每秒保存时会导致错误。

  2. " saveWithBlock"方法用于异步保存,这意味着它将在准备好后立即保存上下文(通常是立即),因此如果您尝试立即检查更改并获取数据,则可能尚未保存。

  3. 它将帮助您更多地了解不同上下文之间核心数据的差异 - MainQueue和PrivateQueue。

    通常我会使用给定的方法:

    [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]
    

    [[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreAndWait]
    

    您还可以使用MR_saveToPersistentStoreWithCompletion:进行异步保存。

    这样就可以保存整个上下文,而无需选择特定的实体。

    如果您是初学者,也可以查看CoreDataStack

    这是一个更新,最新的核心数据包装器