如何使用 NSDistributedNotifications 在进程之间共享核心数据存储?

2023-11-23

背景

我已经发布了一个关于基础知识的问题在进程之间共享核心数据存储.

我正在尝试实施给出的建议,但遇到了问题。

My Goal

我有两个进程 - Helper App 和 UI。它们都共享一个数据存储。当助手应用程序将新数据保存到商店时,我希望 UI 更新它的 NSManagedObjectContext 。

当前程序流程

  1. Helper App Process 将数据写入 Store。

  2. 在 Helper 应用程序中,我监听 NSManagedObjectContextDidSaveNotification 通知。

  3. 保存上下文时,我使用 URI 表示和 NSArchiver 对插入、删除和更新的对象进行编码。

  4. 我使用此编码字典作为 userInfo 向 NSDistributedNotificationCenter 发送 NSNotification。

  5. UI 进程正在侦听保存通知。当它收到通知时,它使用 NSUnarchiver 取消归档 userInfo。

  6. 它从给定的 URI 中查找所有更新/插入/删除的对象,并将它们替换为 NSManagedObjects。

  7. 它使用更新/插入/删除的对象构造一个 NSNotification。

  8. 我在 UI Process 的托管对象上下文上调用 mergeChangesFromContextDidSaveNotification: ,传入我在上一步中构造的 NSNotification。

问题

插入的对象会正确地进入 UI 托管对象上下文并出现在 UI 中。问题来自更新的对象。他们只是不更新​​。

我尝试过的

  1. 最明显要尝试的事情是 是通过保存通知 从 Helper App 进程到 用户界面流程。容易,对吧?嗯,不。 分布式通知不会 让我以 userInfo 的身份执行此操作 字典不在右边 格式。这就是为什么我要做所有的事情 NS存档的东西。

  2. 我试过打电话 刷新对象:合并更改:是 要更新的 NSManagedObjects, 但这似乎没有任何 影响。

  3. 我尝试过执行 mergeChangesFromContextDidSaveNotification: 主线程上的选择器和 当前线程。似乎两者都没有 影响结果。

  4. 我尝试过使用 mergeChangesFromContextDidSaveNotification: 在线程之间之前,哪个 课程简单得多并且有效 完美。但我也需要这个 进程之间的功能。

备择方案?

我在这里错过了什么吗?我一直有一种感觉,我让这个事情变得比它需要的要复杂得多,但是在阅读了几次文档并花了几天时间研究这个之后,我看不到任何其他方式来刷新 MOC用户界面。

有没有更优雅的方法来做到这一点?或者我只是在代码中的某个地方犯了一个愚蠢的错误?

The Code

我已尝试使其尽可能具有可读性,但仍然很混乱。对不起。

助手应用程序代码

   -(void)workerThreadObjectContextDidSave:(NSNotification *)saveNotification {
        NSMutableDictionary *savedObjectsEncodedURIs = [NSMutableDictionary dictionary];
        NSArray *savedObjectKeys = [[saveNotification userInfo] allKeys];

        for(NSString *thisSavedObjectKey in savedObjectKeys) {
            // This is the set of updated/inserted/deleted NSManagedObjects.
            NSSet *thisSavedObjectSet = [[saveNotification userInfo] objectForKey:thisSavedObjectKey];
            NSMutableSet *thisSavedObjectSetEncoded = [NSMutableSet set];

            for(id thisSavedObject in [thisSavedObjectSet allObjects]) {
                // Construct a set of URIs that will be encoded as NSData
                NSURL *thisSavedObjectURI = [[(NSManagedObject *)thisSavedObject objectID] URIRepresentation];
                [thisSavedObjectSetEncoded addObject:thisSavedObjectURI];
            }
            // Archive the set of URIs.
            [savedObjectsEncodedURIs setObject:[NSArchiver archivedDataWithRootObject:thisSavedObjectSetEncoded] forKey:thisSavedObjectKey];
        }

        if ([[savedObjectsEncodedURIs allValues] count] > 0) {
            // Tell UI process there are new objects that need merging into it's MOC
            [[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"com.synapticmishap.lapsus.save" object:@"HelperApp" userInfo:(NSDictionary *)savedObjectsEncodedURIs];
        }
    }

UI Code

-(void)mergeSavesIntoMOC:(NSNotification *)notification {
    NSDictionary        *objectsToRefresh        = [notification userInfo];
    NSMutableDictionary *notificationUserInfo    = [NSMutableDictionary dictionary];
    NSArray *savedObjectKeys = [[notification userInfo] allKeys];

    for(NSString *thisSavedObjectKey in savedObjectKeys) {
        // Iterate through all the URIs in the decoded set. For each URI, get the NSManagedObject and add it to a set.
        NSSet *thisSavedObjectSetDecoded = [NSUnarchiver unarchiveObjectWithData:[[notification userInfo] objectForKey:thisSavedObjectKey]];
        NSMutableSet *savedManagedObjectSet = [NSMutableSet set];

        for(NSURL *thisSavedObjectURI in thisSavedObjectSetDecoded) {
            NSManagedObject *thisSavedManagedObject = [managedObjectContext objectWithID:[persistentStoreCoordinator managedObjectIDForURIRepresentation:thisSavedObjectURI]];
            [savedManagedObjectSet addObject:thisSavedManagedObject];
            // If the object is to be updated, refresh the object and merge in changes.
            // This doesn't work!
            if ([thisSavedObjectKey isEqualToString:NSUpdatedObjectsKey]) {
                [managedObjectContext refreshObject:thisSavedManagedObject mergeChanges:YES];
                [managedObjectContext save:nil];
            }
        }
        [notificationUserInfo setObject:savedManagedObjectSet forKey:thisSavedObjectKey];
    }
    // Build a notification suitable for merging changes into MOC.
    NSNotification *saveNotification = [NSNotification notificationWithName:@"" object:nil userInfo:(NSDictionary *)notificationUserInfo];
    [managedObjectContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
                                    withObject:saveNotification
                                 waitUntilDone:YES];
}

我使用了中的方法

http://www.mlsite.net/blog/?p=518

然后每个对象都正确地出现故障,但故障是在缓存中获取的,因此仍然没有更新

我必须做 [moc stalenessInterval = 0];

最终,通过关系,它奏效了。

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

如何使用 NSDistributedNotifications 在进程之间共享核心数据存储? 的相关文章

  • Core Data 与 SQLite 3 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 无法将 NSMutableDictionary 发送到另一个类

    All 我试图将 NSMutableDictionary 响应 发送到我的另一个类 或者更确切地说 让另一个类从这个类中提取字典 当另一个类使用 getResponse 方法时 它返回 null 我附加的代码是我的 XML 解析器 它将我需
  • Objective-C 语法是什么,椭圆式点表示法? “……”

    我在 Joe Hewitt 的 Three20 源代码中注意到了这一点 而且我以前从未在 Objective C 中见过这种特殊的语法 甚至不知道如何在适当的谷歌搜索中引用它 来自 UITableViewDataSource TTSecti
  • iPhone,使用 isKindOfClass 是否被认为是不好的做法?

    例如 如果有一个 处理所有 类型的方法 if obj isKindOfClass class1 else if obj isKindOfClass class2 etc 这是不好的做法吗 是否有更简洁的替代方案或更好的方法来构建代码 在运行
  • 解析和更改 NSPredicate

    我必须将数据从以前的应用程序版本迁移到新版本 这也会影响一些谓词 NSPredicate实例 由用户保存 这意味着我必须以编程方式更改它们 目前我尝试解析我得到的字符串 NSPredicate predicateFormat 并手动更改一些
  • 如何构建一个在 Mac OS 10.6 上运行并支持 NSUserNotificationCenter 的应用程序?

    我做了很多研究 但找不到我要找的东西 目前 双方Deployment Target and Base SDK我的应用程序设置为10 8 并且运行完美 我可以正确地将通知发布到 Mountain Lions 新的通知中心 构建也在 Mac O
  • Swift NSViewController 响应 mouseDown 事件,但不响应 keyDown 事件

    我正在尝试使用 Swift 和 Cocoa 创建一个适用于 OS X 的应用程序 我希望应用程序能够响应关键事件 而不将焦点放在文本字段上 中 我在 Xcode 中创建了一个带有故事板的新 Cocoa 项目 并将 ViewControlle
  • 使用 NSWorkspace 获取所有正在运行的进程

    我想获取 MacO 中所有正在运行的进程的列表 当我使用 myWorkspace runningApplications 我只得到当前用户应用程序的列表 我如何找到 root 或 mysql 所有者的所有进程的列表 看一下技术问答 QA11
  • iOS 版有 Parse.com 的替代品吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我目前使用 parse com 来管理用户 他们有很棒的 AP I 有不错的后端供我管理东西 但我更愿意托管我自己的数据 服务器后端 我可
  • NSImage 的 ressizedImageWithCapInsets ?

    In UIKit我们有 UIImage resizableImageWithCapInsets UIEdgeInsets capInsets 有类似的东西吗AppKit用于创建可平铺的NSImage NSImage 在 10 10 Yose
  • 如何多次从 NSHTTPCookieStorage 中清除 cookie?

    我的桌面应用程序连接到 Google App Engine 上托管的网络应用程序 一旦通过身份验证 它就会获得一个 authtoken cookie 并为所有未来的请求传递该 cookie 这一切都有效 但现在我想添加 退出 我尝试像这样实
  • 如何从 NSString 中获取每一行?

    如果我有一个包含文本文件的 NSString 如何获取 NSString 的 NSArray 其中每个 NSString 都包含该文件的一行 在 10 5 中我这样做了 NSArray lines str componentsSeparat
  • NSTableView 在编辑时点击 Tab 键可从行跳转到行

    我有一个 NSTableView 编辑时 如果我点击选项卡 它会自动跳到下一列 这太棒了 但是当我编辑最后一列中的字段并点击选项卡时 我希望焦点跳转到下一行的第一列 有什么建议么 感谢 Michael 提供的起始代码 它非常接近最终的工作结
  • Xcode 9.2 UIDocumentBrowserViewController:无法从 bookmarkableString 创建 url

    Update Xcode 9 3 已修复它 在创建 UIDocument 文件时UIDocumentBrowserViewController 默认 错误 无法解析书签 错误 错误域 NSFileProviderInternalErrorD
  • GameKit 蓝牙传输问题

    我正在尝试使用 GameKit 框架通过蓝牙发送文件 我遇到的问题是我一次只能发送一个 NSData 对象 但我需要将其保存在另一端 如果不知道文件名 这显然是不可能的 但我不知道如何传输它 我尝试将其转换为字符串NSData data N
  • 阻止 NSView 实例接收鼠标事件

    我在窗口中有一个 NSView 并且核心动画层已打开 我时常使用此视图来显示带有动画的图像 我需要整个视图作为后层 而不仅仅是图像 在这个我称为 AnimationBaseView 的视图后面是用户交互的其他视图 一切都很好 除了 Anim
  • 不区分大小写的 NSString 比较

    使用此代码我可以比较字符串值 elementName isEqualToString Response 但这是区分大小写的 有没有办法比较字符串而不区分大小写 有一个caseInsensitiveCompare 方法上NSString 你为
  • 如何让程序在登录时自动启动?

    如何设置菜单栏应用程序在登录时自动启动 我希望这是默认的 我可以简单地通过在 info plist 中添加一个 bool 来做到这一点吗 此解决方案仅适用于非沙盒应用程序 LSSharedFile此解决方案中使用的功能仅适用于非沙盒应用程序
  • 从选定的文件夹中获取大小 >100MB 的文件列表及其路径目标 c

    我想获取我的 mac 系统的所有文件及其路径和大小的列表 由此 我只想过滤那些文件大小超过 100 MB 的文件 我使用下面的代码获取了系统的大小 NSError error NSFileManager fileManager NSFile
  • SwiftUI 中的计算 (NSObject) 属性不会更新视图

    所以 我想要一个Text它根据我的 CoreData 模型的内容更改其内容 为此 我在 Xcode beta 4 中使用了计算属性 但它似乎不再起作用了 这是一个错误还是还有其他我没有看到的问题 我真正遇到的问题是我的视图 和计算的属性 似

随机推荐

  • makefile 中的错误:_start 的多个定义

    我尝试编写一个makefile CC g LD ld CFLAGS Wall std c 0x O3 LDFLAGS lgsl lgslcblas lpthread SOURCES main cpp OBJECTS SOURCES cpp
  • 使用 jdbc 和 oracle 驱动程序时结果集的存储位置

    一旦我将jdbc与oracle驱动程序一起使用并运行select查询 查询的结果是否存储在oracle内存或文件系统或临时表的服务器中 一旦我通过获取下一行来运行下一个方法 它是否会从 oracle 服务器内存加载到 jvm 内存 如果我将
  • 如何使用 Jest 和 Enzyme 模拟 React 组件生命周期方法?

    完整 DOM 渲染的 Enzyme 文档here包含以下使用 Sinon 监视生命周期方法的示例 describe
  • ffmpeg:连接视频和图像

    我有 2 个视频 相同的分辨率 相同的编码 文件 我想要连接它们 并且我想在它们之间插入一些文本 3 秒 作为分割器 我在 Windows 上使用 ffmpeg 执行此操作 我感兴趣的可选想法 避免在此过程中重新编码视频 在每个部分的交叉处
  • Presto SQL:使用作为查询结果的时区字符串更改时区不起作用

    我通过 Mode Analytics Platform 连接到 AWS Athena 并使用其查询引擎 基于 Presto 0 172 查询表 这张表public zones时区信息存储在名为的列中time zone在我感兴趣的一些区域 存
  • 使用 OpenCV 检测灰色物体

    我想使用 OpenCV 检测一个与场景中其他元素明显不同的对象 因为它是灰色的 这很好 因为我可以使用 R G B 运行测试 并且它允许独立于亮度 但逐像素执行速度很慢 有没有更快的方法来检测灰色的东西 也许有一个 OpenCV 方法可以进
  • xamarin Forms:根据键盘高度向上移动视图

    我正在使用 xamarin 表单 我用xaml设计了一个登录表单页面 我想在键盘出现时向上移动登录表单视图 以便文本字段和登录按钮在两个平台上都可见Android and IOS 如何计算键盘高度并通过动态计算键盘高度将登录表单视图向上移动
  • perl文档中哪里提到了0.0001、0.00001打印差异?

    perl 文档中的哪里提到了何时将在这里获得指数格式 perl wle print for 0 001 0 0001 0 00001 1 00001 0 001 0 0001 1e 05 1 00001 No I am not谈论print
  • Android中使用Content Provider批量删除项目

    我正在尝试批量删除表中的某些项目 String ids 1 2 3 mContentResolver delete uri MyTables ID ids 但是我不断收到以下错误 java lang IllegalArgumentExcep
  • Android viewPager 图片从右向左滑动

    我想添加图像幻灯片 但无法使其从右向左滑动 适用于阿拉伯语或希伯来语等语言 我检查了stackoverflow上的几乎所有回复 但找不到明确的解决方案 我在这里写下整个代码 请写清楚 我不是专业人士 主要活动 package com man
  • 在 Visual Studio 2010 中创建文件时是否可以自动设置“复制到输出目录”?

    我最近开始尝试使用 LuaInterface 来让 Lua 脚本在我的 C 程序中工作 为了在 Visual Studio 中轻松创建 Lua 脚本 我安装了 Lua 语法突出显示插件并创建了一个项目模板 以便我可以通过右键单击项目文件并选
  • 某些函数式编程结构是否会降低可调试性?

    我听说以下功能会降低可调试性 因为它们是匿名的 调试器无法很好地跟踪它 匿名类 内部类 闭包块 Lambda 函数 这是真的 关于您提到的特定功能 已经有一些很好的答案 一般来说 我想说一些 FP 功能以及以更多 FP 风格进行编程的方面至
  • 您是否应该实现 IDisposable.Dispose() 以使其永远不会抛出异常?

    对于 C 中的等效机制 析构函数 建议是 它通常不应该抛出任何异常 这主要是因为这样做可能会终止进程 这很少是一个好的策略 在 NET 中的等效场景中 抛出第一个异常 由于第一个异常而执行了finally块 finally 块调用 Disp
  • 是否可以在常规对象(而非 DOM 对象)上分派事件? [复制]

    这个问题在这里已经有答案了 我刚刚发现 FileReader 调度事件就像它是 DOM 元素一样 是吗 我想知道是否可以创建一个类似于 FileReader 的对象 它没有 HTML XML 结构的表示 但可以调度事件 FileReader
  • async.each 和 async.eachSeries 之间的区别

    Is 异步每个作为异步数组迭代工作 Is async eachSeries作为同步数组迭代工作 它实际上等待响应 我问这些是因为两者都有回调 但 async each 的工作方式类似于异步数组迭代 This is traditional w
  • 序列化可选的 where 子句参数?

    这是一件让我真正烦恼的事情 我必须为几乎相同的查询编写两个不同的函数 假设我有一个返回的 APIposts与特定的相关联typeId and cityId 要得到ALL相关帖子typeId 1 OR 2 OR 3 and cityId 1我
  • VB.NET静态代码分析

    有谁知道 vb net 的良好代码静态代码分析吗 我见过很多关于 c 的内容 我认为 VS 2008 内置了一些 但我们目前只使用 vs 2005 FxCop就是这么做的 具体针对 VB NET 的是项目分析器
  • 如何从 html 按钮调用 Firefox 扩展中的函数

    如何使用网页中的 html 按钮调用在我的扩展中声明的 Javascript 函数 我有一个 html 页面 里面有一个按钮 当用户单击该按钮时 它将调用我已经在自己的 Firefox 扩展中声明的函数 由于您控制网页 因此执行您想要的操作
  • 按共享列值合并关联数组的数组[重复]

    这个问题在这里已经有答案了 我想根据公共列值合并两个数组 这是我的 2 个数组 array1 total process per category gt 6 category id gt 1 total process per catego
  • 如何使用 NSDistributedNotifications 在进程之间共享核心数据存储?

    背景 我已经发布了一个关于基础知识的问题在进程之间共享核心数据存储 我正在尝试实施给出的建议 但遇到了问题 My Goal 我有两个进程 Helper App 和 UI 它们都共享一个数据存储 当助手应用程序将新数据保存到商店时 我希望 U