【发布时间】:2014-06-16 19:05:10
【问题描述】:
我正在努力了解有关 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]]
假设我根本不需要异步保存。所以我可以使用 Option 2 或 saveWithBlockAndWait。 saveWithBlockAndWait 是否比 选项 2 更好?
我只是想确保我最终正确理解了 MagicalRecords 和 CoreData 的行为方式。
【问题讨论】:
标签: ios iphone core-data nsmanagedobjectcontext magicalrecord