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 的相关文章

  • UIView晃动动画

    我试图在按下按钮时使 UIView 摇动 我正在调整我找到的代码http www cimgf com 2008 02 27 core animation tutorial window shake effect http www cimgf
  • 在发生更改事件时将货币格式重新应用到 UITextField

    我正在使用一个包含本地化货币值的 UITextField 我看过很多关于如何使用此功能的帖子 但我的问题是 如何在每次按键后将货币格式重新应用到 UITextField 我知道我可以通过以下方式设置和使用货币格式化程序 NSNumberFo
  • Flutter 应用程序在 iOS 平台的 firebase 电话身份验证中崩溃

    我在我的项目中实现了 Firebase Phone auth 在 Android 端 一切正常 但对于 iOS 端 当我尝试从我的端发送验证码时 应用程序崩溃并失去连接 我已在下面提交了我的代码 主程序 dart class MyApp e
  • Glib 在 iPhone 应用程序中的使用

    我想基于现有的开源 Objective C 框架开发一个 iPhone 应用程序 但是该框架广泛使用了 glib 库 我找不到一种方法来构建和包含 iPhone 应用程序的 glib 库 非越狱 有什么办法可以做到这一点 或者有没有推荐的方
  • 从超立方体图像中获取文本的确切位置

    使用 tesseract 中的 GetHOCRText 0 方法 我能够检索 html 中的文本 并在 webview 中呈现 html 时 我能够获取文本 但图像中文本的位置与输出不同 任何想法都非常有帮助 tesseract gt Se
  • iPhone 应用程序在 iOS 4 上安装后无法启动,但设备重启后可以运行

    我有一个在 iOS 3 0 3 1 3 上运行良好的应用程序 然而 在测试 iOS 4 SDK 特别构建时 该应用程序的行为很奇怪 安装后 使用 Xcode iTunes 或 iPhone 配置实用程序 应用程序会执行以下两项操作之一 应用
  • 使用可达性有什么好处?

    与下面的代码相比 使用 Reachability 有什么优势 我觉得 Reachability 有大量代码 但如果它在任何方面更好 那么我会使用它 NSString connectionString NSString alloc initW
  • iPhone - 如何通过基于度数的位置获取方向

    首先 我在班级中实现了位置管理器功能 并且运行良好 并为我提供了当前位置 从那个位置我得到了如何获得位置度here http www switchonthecode com tutorials getting your location i
  • 以编程方式单击 tabbarController 的选项卡

    我有 2 个带有 Nib 文件的选项卡按钮 在按下选项卡 1 上的按钮时 我希望它显示选项卡 2 的视图 而不是单击选项卡栏按钮 2 我的意思是 我想以编程方式单击第二个选项卡栏按钮 我怎样才能做到这一点 可能吗 您必须创建一个包含以下内容
  • CoreBluetooth广告检测时间

    这个问题早在10月份就已经讨论过here https stackoverflow com questions 12866551 corebluetooth connection setup time varies quite a bit 1
  • nspredicate 数组中的多个项目

    如何使用NSPredicate满足多个条件 NSEntityDescription entity NSEntityDescription entityForName MessageData inManagedObjectContext ma
  • iphone sdk - 调用视图的超级视图的视图控制器的方法

    你好 我如何在当前视图中调用当前视图的超级视图的视图控制器中实现的方法 你能帮我吗 谢谢 通常这是通过代表完成的 让您的视图接口定义一个协议和对某个委托的引用 然后让你的父视图控制器实现这个协议 然后父母会这样做 someView fooD
  • 使用“presentModalViewController”加载视图

    我正在尝试从另一个视图控制器加载临时的滑入视图 我的应用程序的视图控制器的结构如下 Application gt Tab Bar Controller gt TabBarItem gt View Controller 在此视图控制器中 我有
  • iPhone OS:从匿名对象获取方法和变量列表

    我正在构建我的第一个 iPhone Obj c 应用程序 并且我有大量的数据保存子类 我将它们传递给引用函数 对于 cite 函数 这些对象是匿名的 我需要找到一种方法来访问每个传递对象的所有变量 我一直在使用预构建的 NSArray 和选
  • 如何将 UIPopoverPresentationController 的高度设置为与 UITableView 相同

    我在我的应用程序上使用 UIPopoverPresentationController 在我的 iPhone 上显示弹出窗口 使用 UIModalPresentationNone 我希望尺寸随着 UITableView 的高度而动态变化 但
  • UITableViewCell 的 viewDidAppear

    我通常使用viewDidAppear方法在视图完成出现后在视图上执行一些 UI 操作 我在各种情况下使用了此方法 它非常有用 但是 我需要在视图上进行一些 UI 更改UITableViewCell当它完成出现后 SDK中是否有任何可用的方法
  • 如何获取核心数据中现有实体(表)的列表

    如何获取核心数据中特定模式 托管对象模型 的现有实体 表 列表 我刚刚开始实施核心数据概念并坚持这些要点 就像是 SELECT COUNT FROM information schema tables WHERE table schema
  • 在iPhone上将CSV文件读入sqlite3

    有没有办法在iPhone上将CSV文件读入sqlite3 sqlite3 是否有类似于 SQL 命令的功能 LOAD DATA LOCAL INFILE file csv INTO TABLE TABLENAME FIELDS TERMIN
  • 方向改变时重新定位控件

    我知道自动布局可用于在方向改变时使尺寸和位置保持一致 当方向改变时 是否可以完全改变布局 例如 请查看下面的纵向模式下简单登录屏幕的线框 现在 如果我旋转设备 我想完全重新定位控件 这种事情可以用自动布局来完成吗 如果没有 我该怎么办 谢谢
  • 在 iOS 中从 ACAccountStore 获取 Facebook uid?

    您好 我想获取 Facebook 用户的 UIDAC帐户商店在 iOS 6 中 self accountStore ACAccountStore alloc init ACAccountType FBaccountType self acc

随机推荐

  • 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 示例中的显示方式 合并新实体