父/子 NSManagedObjectContext 的正确实现

2024-04-19

我的应用程序有时会将不一定要保存的对象插入到托管对象上下文中。例如,当我启动“添加实体”模式时,我创建一个托管对象并将其分配给该模式。如果用户从该模式保存,我会保存上下文。如果他取消,我会删除该对象并且无需保存。

我现在引入了一个“导入”功能,可以切换到我的应用程序(使用 URL 方案)并添加一个实体。由于这些模式之一可能是打开的,因此此时保存上下文并不安全。即使用户取消,为模态创建的瞬态对象也将被保存,并且不能保证删除(来自取消操作)稍后会被保存 - 用户可能会退出应用程序。

同样,我不能在应用程序退出时简单地进行保存。如果此时模式打开,临时对象将被错误保存。

为了解决这个问题,我尝试使用子上下文,如上所述here http://www.cocoanetics.com/2012/07/multi-context-coredata/。读完我能找到的所有内容后,我仍然有几个问题:

  1. 我应该为每个上下文使用哪种并发类型?请记住,我这样做并不是为了性能/线程优势。我知道如果要具有子上下文,我不能将 NSConfinementConcurrencyType 用于主上下文,但我不确定其他两个选项中哪一个最适合。对于子上下文,是否需要匹配?或者我可以在这里使用限制类型吗?我尝试了多种组合,似乎都工作正常,但我想知道哪种组合适合我的要求。

  2. (附带问题)为什么只有使用 iVar 类才能使其工作?我认为我应该能够在创建临时上下文的方法中声明它,然后使用entity.managedObjectContext 引用它。但当我访问它时它似乎为零?如果我改用 iVar 来保存引用,这个问题就会得到纠正。

  3. 将更改传播到主要上下文的正确方法是什么?我已经看到在每个上下文上使用不同的块包装实现的各种评论。这取决于我的并发类型吗?我当前的版本是:

    //save the new entity in the temporary context
    NSError *error = nil;
    if (![myObject.managedObjectContext save:&error]) {NSLog(@"Error - unable to save new object in its (temporary) context");}
    
    //propogate the save to the main context
    [self.mainContext performBlock:^{
        NSError *error2 = nil;
        if (![self.mainContext save:&error2]) {NSLog(@"Error - unable to merge new entity into main context");}
    }];
    
  4. 当我的用户保存时,它会向其委托(我的主视图控制器)发送一条消息。委托被传递给添加的对象,并且它必须在主上下文中找到相同的对象。但是当我在主上下文中查找它时,却没有找到。主要背景does包含该实体 - 我可以记录其详细信息并确认它在那里 - 但地址不同?如果这是注定要发生的(为什么?),我如何在保存后在主上下文中找到添加的对象?

感谢您的任何见解。很抱歉问了一个很长、由多个部分组成的问题,但我认为以前可能有人已经解决了所有这些问题。


父/子 MOC 模型是 Core Data 的一个非常强大的功能。它极大地简化了我们过去必须处理的古老并发问题。但是,正如您所说,并发不是您的问题。回答您的问题:

  1. 传统上,您使用NSMainQueueConcurrencyType为了NSManagedObjectContext与主线程相关联,以及NSPrivateQueueConcurrencyTypes 用于子上下文。子上下文不需要与其父上下文匹配。这NSConfinementConcurrencyType就是全部NSManagedObjectContext如果您不指定类型,则默认为 s。它基本上是“我将管理自己的核心数据线程”类型。
  2. 在没有看到您的代码的情况下,我的假设是您创建子上下文的范围结束并被清理。
  3. 当使用父/子上下文模式时,您需要使用块方法。使用块方法的最大好处是操作系统将处理将方法调用分派到正确的线程。您可以使用performBlock对于异步执行,或者performBlockAndWait用于同步执行。

您可以使用它,例如:

- (void)saveContexts {
    [childContext performBlock:^{
        NSError *childError = nil;
        if ([childContext save:&childError]) {
            [parentContext performBlock:^{
                NSError *parentError = nil;
                if (![parentContext save:&parentError]) {
                    NSLog(@"Error saving parent");
                }
            }];
        } else {
            NSLog(@"Error saving child");
        }
    }];
}

现在,您需要记住,在保存之前,在子上下文中所做的更改(例如插入的实体)将无法用于父上下文。对于子上下文来说,父上下文是持久存储。保存时,您将这些更改传递给父级,然后父级可以将它们保存到实际的持久存储中。将传播更改保存到上一级。另一方面,获取子上下文将通过每个级别向下拉数据(通过父级并进入子级)

  1. 你需要使用某种形式objectWithID在 ManagedObjectContext 上。它们是在上下文之间传递对象的最安全(也是唯一)的方法。正如汤姆·哈林顿在评论中提到的,你可能想使用existingObjectWithID:error:虽然因为objectWithID:始终返回一个对象,即使您传入无效 ID(这可能导致异常)。更多细节:Link https://stackoverflow.com/questions/4818526/whats-the-proper-way-to-use-nsmanagedobjectcontexts-objectwithid
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

父/子 NSManagedObjectContext 的正确实现 的相关文章

  • 使用 nib 作为带有 nib 类的表节标题

    我想创建一个加载 nib 文件并将其设置为标题 UIView 的节标题 这个 nib 文件还将有一个关联的类 其中插座和操作连接到 因此我想像平常一样使用 nib 加载该类 我在网上搜索并找到了几个类似的答案 但我找不到任何适合我的答案 经
  • AVPlayer 不播放音频 - iOS 9,目标 - C

    我正在尝试从我的应用程序中的 URL 播放音频 iOS 8 中一切都按预期发生 模拟器和物理设备 对于 iOS 9 它可以在模拟器中运行 但在设备上 音频根本无法播放 出现流媒体 如果我单击播放 进度条还显示音频正在加载并播放 但没有声音
  • Google Cloud Messaging 显示成功消息但未发送 iOS

    所以我在使用 Google Cloud Messaging 时遇到了一个非常奇怪的问题 我遇到的问题是它正在成功注册设备 并且当发送消息时我会收到来自 Google 的成功消息 但设备永远不会收到任何消息 我从 GCM 得到的消息是 res
  • 进入后台时 Alamofire 请求卡住?

    我正在使用 Alamofire 调用 Web 服务 该服务需要相当长的时间才能加载 如果应用程序进入后台 当我返回应用程序时 我会被加载程序卡住 我想这是因为调用永远不会向我的完成处理程序返回任何内容 我该如何解决这个问题 您可以使用后台抓
  • iOS WKWebView 处理文件下载

    我面临以下问题 在 Web 界面中 文件下载是通过锚标记触发的 如下所示 a href bla blabla a 虽然 Safari 浏览器可以处理此请求并打开一个对话框来处理文件 但 WKWebView 将此视为普通链接并且不对其执行任何
  • UITesting、XCTest 当前 ViewController 类

    简单的问题 我有一个按钮可以执行到下一个视图控制器的操作 我想写 UI XCTest 来告诉我它是否打开了我想要的视图控制器 UI 测试框架无法访问您的应用程序代码 这使得无法对实例进行类断言 你不能够directly告诉屏幕上的控制器的类
  • 如何在应用程序项目中使用 Cocoa Touch 框架

    我熟悉构建单个 iOS 应用程序 但我坚持使用 Cocoa Touch 框架向多个应用程序共享通用代码 问题 框架的头文件不可见 无法链接到消费应用程序项目 我做了什么 1 我创建了一个名为 libTestFramework 的项目 Coc
  • iPhone SQLite页面缓存不断增长

    I use sqlite数据库用于存储 还有许多数据库事务 我的问题是 sqlite 页面缓存的内存使用量快速增长 在instruments我可以找到这条线 Graph Category Live Bytes Living Transien
  • 如何使用 SwiftUI 获取多个屏幕上的键盘高度并移动按钮

    以下代码获取键盘显示时的键盘高度 并将按钮移动键盘高度 在转换源 ContentView 和转换目标 SecibdContentView 处以相同的方式执行此移动 但按钮在转换目标处不移动 如何使按钮在多个屏幕上移动相同 import Sw
  • 如何区分 iTunes Connect / Apple TestFlight 上的 STAGE 和 PRODUCTION 版本?

    阶段构建与阶段服务器的对话 阶段服务器与生产服务器尽可能相同 以用于测试目的 生产构建与生产服务器的通信 生产服务器存储真实的关键数据 这些构建本质上是针对同一应用程序的 但是 iTunes Connect 界面将向您显示以下内容 即构建由
  • 如何组合两个 SwiftyJSON 对象

    我有一个 swiftyJSON 对象 例如 location http img http commentCount 0 timestamp 1432460217550 我希望能够向其附加另一个 swiftyJSON 对象 使其看起来像 lo
  • Objective C 中类别是如何实现的?

    作为一名程序员 我知道如何使用类别 但我很好奇它们是如何实现的 编译器是否将它们编译为对类替换方法 http developer apple com library mac documentation Cocoa Reference Obj
  • Apple Developer 应用程序门户不再可以生成新的 Bundle Seed ID

    iOS 开发者门户中的新界面不再为您的应用程序 ID 提供 生成新的 按钮 取而代之的是 使用团队 ID 这将导致使用相同的种子 ID 任何人都知道为什么要进行更改以及您应该如何使用新的捆绑包种子 ID 随意补一些 不再可能生成新的种子 I
  • 如何使用 Swift 将“完成”按钮添加到 iOS 中的数字键盘?

    它在默认键盘上工作得很好 但我无法让它在数字键盘上工作 有任何想法吗 据我所知 你不能在键盘部分添加 完成 按钮 你应该添加一个inputAccessoryView to the UITextField or UITextView 如果这就
  • 使用 ZBarSDK 时 iPhone 相机失去自动对焦功能

    我正在开发一个应用程序 用户可以选择是否要扫描条形码或拍摄某物的照片 为了拍照 我正在使用UIImagePickerController照常 为了扫描条形码 我使用 ZbarSDK 1 2ZBarReaderViewController 拍
  • XCode 7 中的 AWSS3TransferManagerUploadRequest

    我今天升级到 Xcode 7 Swift 2 0 我的项目正在使用 CocoaPods 我正在 POD 文件中导入所有与 AWS 相关的文件 我已经设置了桥接标头 并导入了 Amazon 告诉我的所有文件 在升级到 Swift 2 0 之前
  • 当 ViewController 从 UIStoryboard 实例化时,isMemberOfClass 返回 no

    我有一个 OCUnit 测试类 PatientTestViewControllerTests 下面是界面 interface PatientTestViewControllerTests SenTestCase property nonat
  • 无需越狱即可检测iOS9上哪个应用程序处于前台

    我正在尝试记录用户在 iOS9 上的个人应用程序使用情况 我宁愿它不会使用越狱有限的解决方案 不言自明 在越狱手机上执行此应用程序的变体应该不难 https www andyibanez com create mobilesubstrate
  • 下载进度条在 iOS 企业发行版中没有改变进度

    我正在通过企业分发开发和分发 iPad 应用程序 它们下载并执行良好 因此一切正常 Web 链接 ipa 文件 plist 文件 配置 问题 是 当用户单击链接进行下载时 iPad 中显示下载进度的进度条显示 正在等待 但却是空的并且永远不
  • 对象指针值作为字典的键

    我想使用对象的引用值作为字典的键 而不是对象值的副本 因此 我本质上想在字典中存储与另一个对象的特定实例关联的对象 并稍后检索该值 这可能吗 是不是完全违背了NSDictionary的理念 我可以看出我可能以错误的方式处理这个问题 因为字典

随机推荐

  • PowerShell 未启动

    由于某种原因 PowerShell 不再在我的计算机上打开 打开 PowerShell 会显示以下内容 但永远不会完成打开并且永远不会显示提示 Windows PowerShell Copyright C Microsoft Corpora
  • Android 模拟器上的 Mockito

    Android 新手尝试在 Android 中使用我最喜欢的 Java 测试工具 我正在尝试使用 Mockito 1 9 5 如以下博客文章中所述 但无法在我的模拟器上运行测试 我目前没有用于测试的物理设备 Mockit Android 教
  • Android 版百度地图:访问键无法用于位置搜索

    我正在为中国客户创建一个 Android 应用程序 他们需要地图集成 因此 Google 地图不是一个选择 因为所有 Google 服务在中国都被屏蔽 我正在尝试使用百度地图 它被称为百度LBS 基于位置的服务 云 获得没有叠加层的基本地图
  • GetMessage() 在主消息循环中会返回 -1 吗?

    根据获取消息API http msdn microsoft com en us library ms644936 28VS 85 29 aspx从 MSDN 库来看 出现错误时可能会返回 1 该文档提供了应避免的常见错误的代码片段 whil
  • Java:如何在 ScrollPane 视口上绘制非滚动覆盖?

    我想使用 ScrollPane 在其视口中显示图像 并且在图像上覆盖网格 或框 或任何其他类型的注册 位置标记 我需要覆盖层在滚动时保持固定 这意味着图像似乎在覆盖层 下方 移动 我将以固定速率滚动视口中的视图以提供平滑的运动 而叠加层将提
  • 在 JSX 中使用大括号声明 Const

    我刚刚开始使用 React Native 并习惯 JSX 语法 这就是我所说的吗 或者我在谈论 TypeScript 或者 ES6 反正 我见过这个 const foo this props 在类函数内部 大括号的用途是什么 使用它们和不使
  • 查找日历的第一天

    我想做的是创建一个简单的日历 我想找到特定月份第一周的第一天 我的日历是星期一 gt 星期日日历 以下代码可以工作 但正如您所看到的 它并不是那么好 任何人都对如何获取日历中的第一个日期有更好的想法 var now new DateTime
  • 如何让 wget 在网页索引文件的工作本地副本中包含日期和时间戳

    我有一份报告需要每天下载 我想每天下载一次该文件 并让该文件以 report date time html 结尾 示例代码 wget k p O C Users user Desktop New report date time html
  • 使用命令行查找数据文件的行数

    有一种常规方法 逐行读取并检查iostat每次读数时都会达到非零或负值 不过 我想打电话system command 例行公事和 使用wc l命令来计算数量 然后想要分配要放置数据的数组的维度 例如 我以两种方式打印行数 Program T
  • 在每个php脚本之前执行php脚本?

    除了将其放入所有 php 脚本之外 我如何在每个 php 脚本之前运行它 if SERVER REMOTE ADDR 123 123 123 123 SERVER REMOTE ADDR SERVER HTTP X REAL IP 我基本上
  • 如果 Exception 过滤器的过滤器抛出异常会发生什么

    我还没有在 C 6 中工作过 但想知道 正如标题所说 如果Exception过滤器的过滤器抛出异常会发生什么 我想真正的答案是 过滤器应该以永远不会抛出异常的方式编写 但我们可以说它确实如此 异常是否会发生在 catch 本身内部 try
  • Angular 5 订阅和取消订阅 Observable

    我必须从两个订阅获取数据 但我总是得到第一个订阅的数据 我有一个数据共享服务 import Injectable from angular core import BehaviorSubject from rxjs BehaviorSubj
  • 确定 numpy 数组中的相邻区域

    我正在寻找以下内容 我有一个 numpy 数组 它被标记为区域 numpy 数组表示分割图像 区域是具有相同值的多个相邻单元格 每个地区都有其独特的价值 包含 3 个区域的简化版本如下所示 x np array 1 1 1 1 1 2 2
  • 如何在代码构建中将命令的输出分配给变量

    每当推送到我的源代码时 我都会尝试构建一个 docker 映像 并将 docker 映像移动到 ECR EC2 容器注册表 我尝试过以下构建规范文件 version 0 2 env variables IMG app REPO lt
  • 如何在innerhtml中使用ajax和php更新mysql数据库

    如何使用ajax和php更新mysql数据库而不刷新页面 这里有一个好例子 http www w3schools com PHP php ajax database asp 它显示了一个SELECT声明 但它应该是直接的 并且可以轻松地将脚
  • Maxima:如何替换方程中的变量

    我正在尝试写下我的工作笔记 Maxima 简化我工作的方式是 一旦我编写了一堆方程并且我想要更改变量的定义 我就会这样做并重新评估整个文件 这是我想要实现的目标的示例 问题一 我有一个方程组 我想要从 Maxima 得到的只是变量替换 eq
  • Office 2016 共享按钮 IdMso

    我正在尝试禁用 Office 2016 应用程序右上角的新共享按钮 有谁知道通讯员IdMso吗 我尝试查找 IdMso 表 但只找到 Office 早期版本的表 Microsoft 已在此处发布了 Office 2016 的 ID Offi
  • Matlab - 神经网络训练

    我正在努力创建一个具有反向传播的 2 层神经网络 神经网络应该从 20001x17 向量获取数据 该向量在每行中包含以下信息 前 16 个单元格包含从 0 到 15 的整数 它们充当变量 帮助我们确定在看到这些变量时要表达的 26 个字母中
  • 用于电子邮件验证的签名路由未通过签名验证

    我最近将我的项目从 Laravel 5 6 更新到 5 7 并将 Laravel 文档中描述的电子邮件验证步骤添加到我的项目中 在我的开发机器 http 上一切都运行良好 但是当我用所有更改更新我的生产服务器 https 时 当 larav
  • 父/子 NSManagedObjectContext 的正确实现

    我的应用程序有时会将不一定要保存的对象插入到托管对象上下文中 例如 当我启动 添加实体 模式时 我创建一个托管对象并将其分配给该模式 如果用户从该模式保存 我会保存上下文 如果他取消 我会删除该对象并且无需保存 我现在引入了一个 导入 功能