2014-06-16 34 views
3

我很想理解关于MagicalRecord和CoreData的一切。假设我有两块代码做同样的事情,其中​​tallyM是一个在MR_defaultContext中运行的托管对象。MagicalRecord saveWithBlock vs saveToPersistentStoreAndWait

选项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]]]; 

问题:

  1. 哪一个更好?我明白,当你需要异步保存时,可以使用saveWithBlock,但是还有其他区别吗?是选项1更安全或更好选项2

  2. 选项1,我有tallyM运行在MR_defaultContext。然后在saveWithBlock里面,我改变tallyM,改变tallyMLocal,并保存上下文。我可以100%确定在saveWithBlock运行后,在完成处理程序中(当我需要继续使用tallyM时),tallyM(它仍在MR_defaultContext中运行)将会更新tl_countMale?

  3. 选项1,在完成处理程序中,我仍然需要调用下面的代码吗?我假设(已经使用控制台进行了检查,但只是想确定),在执行saveWithBlock后,tallyM仍然在MR_defaultContext中运行。那么是否需要再次调用MR_inContext?

    [tallyM MR_inContext:[的NSManagedObjectContext MR_defaultContext]

  4. 比方说,我不需要异步保存在所有。所以我可以使用选项2saveWithBlockAndWait。是saveWithBlockAndWait以任何方式比选项2

我只是想确保我终于正确理解了MagicalRecords和CoreData的行为方式。

回答

3

就我个人而言,我会避免选项2中的模式。这个想法是,您应该使用单个受管对象上下文作为受管对象集合上的操作范围。这就是为什么大多数示例使用以下模式:

NSManagedObjectContext *localContext = //...; 
NSManagedObject *localObject = [otherObject MR_inContext:localContext]; 
///make changes to localObject 
[localContext MR_saveToPersistentStoreAndWait]; 

的〔MagicalRecord saveWithBlock:]方法基本上以更方便的API实现这种模式。

我也建议不要隐式使用defaultContext。在代码中更明确一些,因为当你的应用程序开始处理线程时,你可能需要将其交换出来。

完成处理程序的写入方式是在保存操作100%完成后总是回调它们。我建议阅读源代码以亲自查看。