我非常努力地了解有关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]]];
问题:
[tallyM MR_inContext:[NSManagedObjectContext MR_defaultContext]]
我只想确保我最终正确理解了MagicalRecords和CoreData的行为。
最佳答案
就个人而言,我会避免那里的选项2中的模式。这样的想法是,您应该使用单个托管对象上下文作为对托管对象集合进行操作的范围。这就是为什么大多数示例使用以下模式的原因:
NSManagedObjectContext *localContext = //...;
NSManagedObject *localObject = [otherObject MR_inContext:localContext];
///make changes to localObject
[localContext MR_saveToPersistentStoreAndWait];
[MagicalRecord saveWithBlock:]方法基本上是在更方便的API中实现此模式。
我也建议不要隐式使用defaultContext。在代码中对此进行更明确的说明,因为当您的应用开始处理线程时,您可能需要将其替换掉。
完成处理程序的编写方式是在保存操作100%完成后始终会对其进行回调。我建议阅读源代码以供自己参考。