我使用的是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的搜索查询变体。如何处理上下文并妥善保存?
答案 0 :(得分:0)
使用CoreData需要了解一些重要注意事项:
您必须使用创建实体的上下文进行保存。 这意味着,如果实体是在不同的线程上创建的,那么它们可能正在使用不同的上下文,有时当有多个线程和大量的每秒保存时会导致错误。
" saveWithBlock"方法用于异步保存,这意味着它将在准备好后立即保存上下文(通常是立即),因此如果您尝试立即检查更改并获取数据,则可能尚未保存。
它将帮助您更多地了解不同上下文之间核心数据的差异 - MainQueue和PrivateQueue。
通常我会使用给定的方法:
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]
和
[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreAndWait]
您还可以使用MR_saveToPersistentStoreWithCompletion:进行异步保存。
这样就可以保存整个上下文,而无需选择特定的实体。
如果您是初学者,也可以查看CoreDataStack
这是一个更新,最新的核心数据包装器