我正在非常努力地理解有关 MagicalRecord 和 CoreData 的一切。比方说,我有 2 段代码做同样的事情,其中 tallyM 是在 MR_defaultContext 中运行的托管对象。
选项 1:
Tally *tallyM = (Tally *)[Tally MR_findFirstWithPredicate:predicateM];
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
Tally *tallyMLocal = [tallyM MR_inContext:localContext];
tallyMLocal.tl_countMale = [NSString stringWithFormat:@"%ld", (long)uiTallyMaleCounter];
} completion:^(BOOL success, NSError *error) {
[self updateTallies_APICall:[tallyM MR_inContext:[NSManagedObjectContext MR_defaultContext]]];
}];
选项 2:
Tally *tallyM = (Tally *)[Tally MR_findFirstWithPredicate:predicateM];
tallyM.tl_countMale = [NSString stringWithFormat:@"%ld", (long)uiTallyMaleCounter];
[tallyM.managedObjectContext MR_saveToPersistentStoreAndWait];
[self updateTallies_APICall:[tallyM MR_inContext:[NSManagedObjectContext MR_defaultContext]]];
问题:
哪个更好?我知道当你需要异步保存时可以使用saveWithBlock,但是还有其他区别吗? 选项 1 是否比选项 2 更安全或更好?
在选项 1 中,我有在 MR_defaultContext 中运行的 tallyM。然后在 saveWithBlock 中,我通过更改 tallyMLocal 和保存上下文来更改 tallyM。我能 100% 确定在 saveWithBlock 运行后,在完成处理程序中(当我需要继续使用 tallyM 时),tallyM(仍在 MR_defaultContext 中运行)将更新 tl_countMale 吗?
在选项 1 中,在完成处理程序中,我还需要调用以下代码吗?我假设(已经用控制台检查过,但只是想确定)执行 saveWithBlock 后,tallyM 仍在 MR_defaultContext 中运行。那么是否需要再次调用MR_inContext?
[tallyM MR_inContext:[NSManagedObjectContext MR_defaultContext]]
假设我根本不需要异步保存。所以我可以使用选项 2,或 saveWithBlockAndWait。 saveWithBlockAndWait 是否比选项 2 更好?
我只是想确保我最终正确理解了 MagicalRecords 和 CoreData 的行为方式。
最佳答案
就个人而言,我会避免那里的选项 2 中的模式。这个想法是您应该使用单个托管对象上下文作为对托管对象集合的操作范围。这就是大多数示例使用以下模式的原因:
NSManagedObjectContext *localContext = //...;
NSManagedObject *localObject = [otherObject MR_inContext:localContext];
///make changes to localObject
[localContext MR_saveToPersistentStoreAndWait];
[MagicalRecord saveWithBlock:] 方法基本上以更方便的 API 实现了这种模式。
我还建议不要隐式使用 defaultContext。在您的代码中更明确地说明这一点,因为当您的应用程序开始处理线程时,您可能需要将其换掉。
完成处理程序的编写方式总是在保存操作 100% 完成后回调它们。我建议您自己阅读源代码。
关于ios - MagicalRecord saveWithBlock 与 saveToPersistentStoreAndWait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24250439/