CoreData 和 mergeChangesFromContextDidSaveNotification

2024-04-04

我正在创建一个addingManagedObjectContext 作为新实体的便笺簿区域,然后在“保存”时将新实体合并到我的主 ManagedObjectContext 中,类似于 CoreDataBooks 示例中的显示方式。

合并新实体后,如何快速引用它以用于显示详细视图?

您是否必须使获取结果控制器退出并再次执行获取(如 CoreDataBooks 代码中所述,昂贵)?我假设对象在“addingManagedObjectContext”中的初始 id 在合并后不会保持不变。

在 Recipes 项目中,不存在这种问题,因为您正在一个 ManagedObjectContext 中创建和使用新实体。因此,您可以引用新创建的项目来显示其详细视图。

来自 CoreDataBooks:

/**
 Add controller's delegate method; informs the delegate that the add operation has completed, and indicates 
 whether the user saved the new book.
 */
- (void)addViewController:(AddViewController *)controller didFinishWithSave:(BOOL)save {

    if (save) {
        /*
         The new book is associated with the add controller's managed object context.
         This is good because it means that any edits that are made don't affect the 
         application's main managed object context -- it's a way of keeping disjoint edits 
         in a separate scratchpad -- but it does make it more difficult to get the new book 
         registered with the fetched results controller.

         First, you have to save the new book.  This means it will be added to the persistent 
         store.  Then you can retrieve a corresponding managed object into the application 
         delegate's context.  Normally you might do this using a fetch or using objectWithID: -- for example

         NSManagedObjectID *newBookID = [controller.book objectID];
         NSManagedObject *newBook = [applicationContext objectWithID:newBookID];

         These techniques, though, won't update the fetch results controller, which 
         only observes change notifications in its context.

         You don't want to tell the fetch result controller to perform its fetch again 
         because this is an expensive operation.

         You can, though, update the main context using mergeChangesFromContextDidSaveNotification: which 
         will emit change notifications that the fetch results controller will observe.
         To do this:
         1  Register as an observer of the add controller's change notifications
         2  Perform the save
         3  In the notification method (addControllerContextDidSave:), merge the changes
         4  Unregister as an observer
         */
        NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
        [dnc addObserver:self selector:@selector(addControllerContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:addingManagedObjectContext];

        NSError *error;
        if (![addingManagedObjectContext save:&error]) {
            // Update to handle the error appropriately.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            exit(-1);  // Fail
        }
        [dnc removeObserver:self name:NSManagedObjectContextDidSaveNotification object:addingManagedObjectContext];
    }
    // Release the adding managed object context.
    self.addingManagedObjectContext = nil;

    // Dismiss the modal view to return to the main list
    [self dismissModalViewControllerAnimated:YES];
}


/**
 Notification from the add controller's context's save operation. This is used to update the 
 fetched results controller's managed object context with the new book instead of performing 
 a fetch (which would be a much more computationally expensive operation).
 */
- (void)addControllerContextDidSave:(NSNotification*)saveNotification {

    NSLog(@"addControllerContextDidSave");
    NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
    // Merging changes causes the fetched results controller to update its results
    [context mergeChangesFromContextDidSaveNotification:saveNotification];  
}

看看这些评论,看起来他们正在谈论获取结果控制器。因此,在您刚刚更改一个对象后,让 FRC 执行新的获取将是相当昂贵的,因此您可以将添加上下文与其合并以通知它任何更改。

执行保存和合并后,您在添加上下文中引用的任何托管对象将不再具有临时对象 ID,因为它们存在于持久存储中。因此,您可以记住 ID 并在主应用程序上下文中使用 [applicationContext objectWithID:newBookID] 就可以很好地获取您正在查找的对象的句柄。这将返回应用程序上下文中的对象(及其所有更改)。

合并后,该对象很可能存在于内存中,并且不需要访问存储。然而,即使是这样,因为您只处理要在详细视图中显示的单个对象,所以根本不是问题。去商店而不是上下文内存会更慢,但显然必须在应用程序期间发生很多次,并且除非您正在处理大量数据,否则不太可能导致问题!

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CoreData 和 mergeChangesFromContextDidSaveNotification 的相关文章

  • 带有 Core Data 对象的动态 UITableView 高度

    过去几天我一直在试图解决一个谜团 即为什么我的批处理大小为 20 的 NSFetchedResultsController 总是在获取完成后立即错误 即加载到内存中 我的所有对象 从而导致请求需要约 20 秒 事实证明 这是因为在我的 he
  • iPhone 崩溃日志?

    我已经配置了一部 iPhone 并让用户安装了该应用程序 它失败 是否有崩溃日志可以让我看到 iPhone 上失败的原因 Ian 如果您可以使用 xcode 将 iPhone 连接到计算机 则在管理器窗口中它会显示每个应用程序崩溃的崩溃日志
  • 如何在 Apple Watch Extension/App 和 iOS App 之间建立通信通道

    我正在探索 WatchKit SDK 当我有 WatchKit 应用程序时 是否可以在 WatchKit 应用程序上从 iPhone 应用程序设置值 例如文本 设置 我可以从 iPhone 应用程序调用 WatchKit 应用程序扩展中的函
  • UIView 子类不会自动调整大小

    我一直在寻找有关调整大小的背景信息 但找不到太多 我知道我需要设置autoresizesSubviews在超级视图和autoresizingMask在子视图上 我已经这样做了 并且我的 UIImageViews 正确调整了大小 但我的自定义
  • 沿着预定路径移动图像?

    是否可以通过按下 iphone SDK 中的按钮来将图像设置为沿着预定路径运动 我不是在寻找任何奇特的东西 我正在研究一个简单的概念 但这会节省大量动画工作 是的 您可以通过创建一个路径来为任何 CALayer 制作动画CAKeyframe
  • Objective C 如何将文本字段添加到导航栏中

    我正在尝试将文本字段添加到导航栏中 但它没有显示在模拟器中 我在 viewdidload 中按如下方式执行 UITextView textField UITextView alloc initWithFrame CGRectMake 0 0
  • Xcode 3.1.4 中内置分析器

    我想知道 Xcode 3 1 4 中内置的分析器是否使得单独使用 LLVM Clang 静态分析器变得多余 请参考这里的原文 使用 LLVM Clang 静态分析器查找内存泄漏 http www fruitstandsoftware com
  • iPhone,如何隐藏标签栏按钮?

    如何隐藏单个标签栏按钮 我已经搜索过 但什么也没找到 只找到了完整的栏 我已经取得了一些进展 但仍然遇到问题 此代码位于我的应用程序委托中 带有选项卡栏的出口 我在其中调用它viewDidLoad选项卡栏中显示的第一个视图的视图 void
  • 如何消除禁用的 UIButton 的灰色外观

    我有一个 UIButton 我希望它处于禁用状态时与处于正常状态时看起来完全相同 现在它看起来有点灰色 不要使用enabled属性或setEnabled NO方法 而是使用 myButton setUserInteractionEnable
  • 如何从通讯录 ios 以编程方式编辑电话号码值

    我正在尝试在 iOS 中以编程方式替换特定联系人的特定电话号码 获取联系人表单地址簿 我不知道为什么我无法保存新的电话号码并刷新地址簿以显示更改 我正在这样做 BOOL changeContactPhoneNumber NSString p
  • 如何在 box2d 中停止作用在物体上的力

    我正在 iPhone 上使用 box2d 来创建游戏 我的身体受重力影响向下移动 而不是向右或向左移动 它会被另一个物体击中 然后向右或向左移动 然后我有一个重置按钮 可以将身体移回到起点 唯一的问题是它仍在向右或向左移动 如何抵消球已经行
  • 如何使用libxml解析来解析xml数据

    这是一个我想使用libxml解析来解析的xml结构 我如何获取 campaign 标签的属性值 即ID对于 图像 标签 即url and size 如果我使用这些值 我可以提取 code 标签和 name 标签的值 static const
  • 自定义事件多久才会出现?

    我正在尝试使用 Flurry 将分析跟踪添加到 iPhone 应用程序 我已经连接了 Flurry 并且它似乎可以很好地跟踪会话和使用情况 但是 我刚刚尝试添加自定义事件日志 但每当我查看 Flurry 分析 事件 页面时 它都会告诉我 您
  • 电话 GAP 会话存储

    我使用手机 GAP 开发 iPhone 应用程序 在我的应用程序中 我们使用外部数据库 用户使用 Web 服务登录 登录后我需要存储用户 ID 我如何使用手机 GAP 存储用户 ID 我可以使用手机 GAP会话存储可以吗 哪位知道的请帮忙
  • 如何在 iOS (safari) 中获取 mailto 链接以打开 Outlook 应用程序?

    我注意到 在使用 Outlook 应用程序且未配置本机邮件应用程序的 iPhone 用户上 当他们单击 mailto 链接时 系统会提示他们在 iOS 中创建新的电子邮件帐户 而不是打开 Outlook 应用程序 是否可以将 Outlook
  • 简单的 iPhone 运动检测

    我需要检测陀螺仪 加速度计何时被激活一定量 基本上是检测设备何时移动 我对核心运动一无所知 也许有人可以指导我入门教程或其他东西 提前致谢 我认为你必须使用 Core Motion 好消息是 它对于您的问题域来说并不难使用 开始阅读事件处理
  • Three20中的TTSpeechBubbleShape仅绘制“语音”三角形顶部和底部

    因此 我将 Three20 库用于 iPhone 应用程序 并希望将 TTSpeechBubbleShape 样式用于视图 但三角形似乎不想画在左边或右边 我在源代码中看到它有很多几何图形 并且想知道是否有人解决了这个问题或知道如何解决它
  • 在 iOS Swift 2 中实现“阅读更多”按钮以展开 UITextView 的最简单方法?

    我希望实现一个 阅读更多 按钮 该按钮将扩展 UITextView 以便有人可以根据需要阅读整个文本 我还没有找到一种简单的方法来实现这一目标 我尝试 玩弄 容器的高度 但它没有给我想要的结果 我真的很感激任何想法 我会推荐你 ilyapu
  • 如何在 UIWebView 中启用放大/缩小选项?

    如何在 UIWebView 中启用放大 缩小选项 这是 UIWebView 的默认功能 用你的手指
  • 将UIWebView显示的PDF保存到本地

    我有一个UIViewController与UIWebView显示一个 pdf 文件 具体取决于之前单击的行UITableView 现在我想添加一个按钮 供用户在本地保存此 pdf 文件以供离线使用 然后还有第二个UITableView它应该

随机推荐

  • Angular 4 HttpClient 查询参数

    我一直在寻找一种将查询参数传递到 API 调用中的方法HttpClientModule s HttpClient并尚未找到解决方案 与旧的Http模块你会写这样的东西 getNamespaceLogs logNamespace Setup
  • 无法读取 null 属性“样式” - Google 登录按钮

    我正在尝试为我的网站实施 Google 登录 登录按钮正确显示 并且最初可以很好地进行登录 当我在使用网站后注销并尝试移至登录页面 我使用的是 React 所以都是一页 时 就会出现问题 我使用完全相同的函数来呈现登录页面 但它给了我一个
  • Furo Sphinx 主题在 API 文档中保留过多的大写字母

    我面临着这个问题中讨论的同样的问题 Furo Sphinx 主题在 API 文档中大写过多 https stackoverflow com questions 69873561 furo sphinx theme uppercases to
  • Angular2 ngOnDestroy,发出事件

    是否可以在 ngOnDestroy 上发出自定义事件 我尝试过 但似乎不起作用 我基本上需要知道指令何时从 UI 中删除 Output rowInit new EventEmitter Output rowDestroy new Event
  • 如何统计group by返回的组数?

    select count as count from table group by foreign id order by count 这将返回每个外部 ID 的多个匹配项 然而 我正在寻找的是总结结果 所以结果是 10 results g
  • 我需要双向创建 automapper createmap 吗?

    这可能是一个愚蠢的问题 n00b 到 AutoMapper 并且时间很短 我想使用 AutoMapper 从 EF4 实体映射到 ViewModel 类 1 如果我打电话 CreateMap
  • 表单位置位于屏幕右下角

    我正在使用 c WinForm 开发 sman 通知应用程序 我想将主窗体放置在屏幕工作区域的右下角 在多个屏幕的情况下 有没有办法找到最右边的屏幕来放置应用程序 或者至少记住上次使用的屏幕并将表单放置在其右下角 我目前没有多个显示器可供检
  • Python/Matplotlib - 快速更新轴上的文本

    我在 wxpython 窗口中有一个 matplotlib 图 画布 我想在鼠标移动时更新绘图上的一些信息 我已连接到 motion notify event 来获取此信息 在下面的代码中 绘制了大量随机数据 然后在窗口的状态栏中显示光标的
  • 如何使用 Consul 中定义的默认值在 Terraform 中定义可选变量

    我有一个 Terraform 脚本 其中包含一些从 Consul 填充的变量 我想在两种不同的场景中使用这个脚本 场景 1 使用 Consul 的默认值一切正常 场景 2 我需要覆盖一些变量 我检查了 Terraform 文档 发现我无法使
  • 在 Golang 中取消引用地图索引

    我目前正在学习 Go 我制作了这个简单粗暴的库存程序只是为了修补结构和方法以了解它们是如何工作的 在驱动程序文件中 我尝试从收银台类型的项目映射中调用方法和项目类型 我的方法有指针接收器来直接使用结构而不是复制 当我运行该程序时 我收到此错
  • 如何使用javascript检查客户端系统中是否安装了特定软件?

    是否可以使用Javascript检测客户端系统是否安装了特定的Windows应用程序 我开发了一个网站 该网站必须检测仅由我们开发的应用程序 但我想让你知道 网站名称和 Windows 应用程序名称是不同的 我的意思是考虑我的网络应用程序名
  • Python:string.uppercase 与 string.ascii_uppercase

    这可能是一个愚蠢的问题 但我不明白字符串模块中 string uppercase 和 string ascii uppercase 之间有什么区别 打印两个函数的文档字符串会打印相同的内容 甚至输出print string uppercas
  • 在一次搜索中搜索 LDAP 上的用户和关联组

    LDAP 新手 我们的 LDAP 的排列方式是 人员 和 组 人们拥有姓名 uid 和邮件等用户信息 这些组具有组名称和多个成员字段 其值如 cn First Last cn people dc comic dc com 列出了该组成员的人
  • 在其声明之上调用函数

    void foo bar error bar has not been declared void bar namespace N void foo N bar error bar is not a member of N void bar
  • Visual Studio Code:.git 文件夹/文件隐藏

    我现在正在尝试 Visual Studio Code 关于 Visual Studio Code 的所有内容对我来说都非常酷 除了一件事 git 文件夹 文件隐藏在 Visual Studio Code 中 我经常通过修改 git配置文件
  • 如何在不复制粘贴的情况下以相同的方式扩展两个类?

    我写了一个楼主画的TabControl 但是我们的项目也使用了TabWorkspace其源自TabControl 此刻 我有 public class OurTabControl TabControl some code that over
  • 如何在窗口栏中获取菜单?

    我想知道如何在窗口栏中获取菜单 就像 Visual Studio 一样 如果能够在左侧显示 文件 编辑 等按钮 在右侧显示标准的 最小化 最大化 和 关闭 按钮 那就太好了 这是可能吗 我尝试过设置Window WindowStyle No
  • Android Intent Data Uri 查询参数

    我正在尝试使用如下意图启动我的应用程序 adb shell am start a android intent action VIEW d my scheme my host queryParam1 QueryParam1 queryPar
  • Xcode 8 无法导出 Ad Hoc 发行版的存档版本

    当我尝试在 Xcode 8 中导出存档应用程序以进行临时分发时 我收到一条错误消息 有没有匹配的配置文件 and 现有的配置文件缺乏应用程序标识符和钥匙串访问组权利 有什么问题吗 我怎样才能让它发挥作用 我尝试在开发人员会员中心生成临时分发
  • CoreData 和 mergeChangesFromContextDidSaveNotification

    我正在创建一个addingManagedObjectContext 作为新实体的便笺簿区域 然后在 保存 时将新实体合并到我的主 ManagedObjectContext 中 类似于 CoreDataBooks 示例中的显示方式 合并新实体