ios - MagicalRecord saveWithBlock 与 saveToPersistentStoreAndWait

标签 ios iphone core-data nsmanagedobjectcontext magicalrecord

我正在非常努力地理解有关 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]]];

问题:

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

  2. 选项 1 中,我有在 MR_defaultContext 中运行的 tallyM。然后在 saveWithBlock 中,我通过更改 tallyMLocal 和保存上下文来更改 tallyM。我能 100% 确定在 saveWithBlock 运行后,在完成处理程序中(当我需要继续使用 tallyM 时),tallyM(仍在 MR_defaultContext 中运行)将更新 tl_countMale 吗?

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

    [tallyM MR_inContext:[NSManagedObjectContext MR_defaultContext]]

  4. 假设我根本不需要异步保存。所以我可以使用选项 2,或 saveWithBlockAndWaitsaveWithBlockAndWait 是否比选项 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/

相关文章:

ios - 更改 UITableView 部分标题的默认滚动行为

iphone - 在 iOS 中使用 URL 将 Imageview 图像保存在 SQL 数据库中

ios - 在 iOS 中的核心数据和 NSFetchedResultsController 中点击我的屏幕之前,reloadData 无法正常工作

iOS 核心数据加密

ios - 在 UIScrollView 中高效加载多个 View

ios - 如何将单元格标签的值从 tableView 传递到其他 View?

ios - Storyboard中的图像 Assets 未显示正确的图像

iPhone 应用程序使用特定 URL 在 UIWebView 中使用 mach_msg_trap 崩溃

ios - 在 WatchKit 中将 iOS 应用带到前台

iphone - 核心数据不保存我的数据。应用程序关闭后我丢失了所有保存的数据