- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在非常努力地理解有关 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/
我想要实现的一件事 - 检测何时创建所有实体并将其表示在我的表中。 据我了解,当创建所有核心数据条目时,将调用以下代码的完成 block ?我对吗?因为当我尝试在另一个 Controller 中查找所
我在使用 [MagicalRecord saveWithBlock:completion] 方法保存我的对象时遇到了问题。当我切换到使用普通 block 时,它工作正常。使用版本 2.2develop
在objC中saveWithBlock的方式是 [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
我正在非常努力地理解有关 MagicalRecord 和 CoreData 的一切。比方说,我有 2 段代码做同样的事情,其中 tallyM 是在 MR_defaultContext 中运行的托管
这有效,但 MR_contextForCurrentThread 已弃用: // context = [NSManagedObjectContext MR_contextForCurrentTh
我正在使用 MagicalRecord 将我的自定义 CoreData 函数更改为更好的东西。 我有两个实体:报价(视频游戏报价)和系统(游戏机、PC、etx)。一个报价可以有一个或多个系统,我从 P
[MagicalRecord saveWithBlock:completion:] 在什么情况下会在完成 block 中显示 NO 成功并出现 nil 错误? 我见过的一种情况是保存 block 内的
我正在尝试使用此 block 导入实体 MagicalRecord.saveWithBlock({ (moc: NSManagedObjectContext!) in
我刚刚更新到 XCode 7 的 beta 5,现在在以下 Swift 代码上遇到编译错误: MagicalRecord.saveWithBlock({ (localContext : NSManag
我是一名优秀的程序员,十分优秀!