与 NSPersistentContainer 的核心数据并发

2023-12-14

NOTE:我看过类似的问题,但没有找到描述这种情况的问题。

我正在查看 Apple 提供的有关核心数据并发性的以下示例代码(https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Concurrency.html)

NSArray *jsonArray = …;
NSPersistentContainer *container = self.persistentContainer;
[container performBackgroundTask:^(NSManagedObjectContext *context) {
    for (NSDictionary *jsonObject in jsonArray) {
        AAAEmployeeMO *mo = [[AAAEmployeeMO alloc] initWithContext:context];
        [mo populateFromJSON:jsonObject];
    }
    NSError *error = nil;
    if (![context save:&error]) {
        NSLog(@"Failure to save context: %@\n%@", [error localizedDescription], [error userInfo]);
        abort();
    }
}];

在我的应用程序中,直到用户点击屏幕上的保存按钮后才会启动保存。我该如何解决这个问题,在这种情况下,我应该使用子上下文来代替,其中私有上下文是 VC 的属性?

NSArray *jsonArray = …; //JSON data to be imported into Core Data
NSManagedObjectContext *moc = self.persistentContainer.viewContext; //Our primary context on the main queue

NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[private setParentContext:moc];

[private performBlock:^{
    for (NSDictionary *jsonObject in jsonArray) {
        NSManagedObject *mo = …; // WHICH CONTEXT TO USE?  <<<======
        //update MO with data from the dictionary
    }
    NSError *error = nil;
    if (![private save:&error]) {
        NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
        abort();
    }
}

然后,一旦用户点击“保存”,请执行以下操作:

NSManagedObjectContext *moc = self.persistentContainer.viewContext; //Our primary context on the main queue
   [moc performBlockAndWait:^{
            NSError *error = nil;
            if (![moc save:&error]) {
                NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
                abort();
            }
        }];
    }];

另请注意上面示例中使用哪个 moc 的问题 (

EDIT:我最终做的是立即保存子上下文,以便表只使用viewContext显示结果。如果用户随后退出而不保存,我会再次从viewContext。保存按钮仍然存在,但现在仅设置一个标志,指示不删除结果。


如果您有一页表单,并且希望在用户按下保存按钮时保存它,则只需从文本字段(或您的数据输入是什么)中获取数据,然后使用以下命令将其放入核心数据中:performBackgroundTask。由于数据仅在用户编辑时存储在文本字段中,如果用户推回,他的编辑将会丢失。

如果您对包含许多不同实体的复杂文档进行了大量更改,用户可以创建、销毁或链接这些实体,并且所有这些更改仅在用户按下“保存”时才会保存,那么您应该使用子上下文。您将根据子上下文中的值显示数据,但仅在用户按下“保存”时才将这些更改推送到父上下文。这是一种非常罕见的情况,我个人从未遇到过这样做的需要。

我强烈怀疑你属于第一种情况。不要使用子上下文。使用performBackgroundTask并在用户按下保存时保存数据。

(也是在块内使用的正确上下文[private performBlock:^{ is the private语境)

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

与 NSPersistentContainer 的核心数据并发 的相关文章

随机推荐

  • 如何改变VBA中形状文本的样式?

    我用以下代码行更改了文本的大小 shp CellsSRC visSectionCharacter 0 visCharacterSize FormulaU 3pt 我想使用相同的代码模式更改形状文本的样式 粗体 和颜色 我没有找到确切的 公式
  • Visual Studio 2015 TFS .tfignore 文件

    我想忽略 Visual Studio 2015 解决方案中的文件夹 及其内容 签入 tfs 我在项目的根目录中创建了一个名为 tfignore 的文件 其中包含我要排除的文件夹 该文件的内容如下所示 Dist 这根本不起作用 即使我添加 c
  • 主函数内部静态分配大量内存

    我有一个程序必须在 C 中声明一个大小为 1000000 的巨大整数数组 使用 GNU GCC 编译器 我尝试用两种不同的方式声明数组 两个可能的代码是 include
  • 如果要同步读,是否还需要同步写?

    我对同步块没有什么疑问 在提出问题之前 我想分享另一篇相关帖子的答案相关问题答案的链接 我引用彼得 劳瑞来自同一个答案 synchronized ensures you have a consistent view of the data
  • PHP 逐行读取时可以排除换行符吗?

    我想逐行阅读 但我不想处理换行符 我希望将其删除 这样我最终只得到该行的内容 所以现在我的功能是 function getProductCount path count 0 foreach file path as name if name
  • 在哪里可以找到elasticache redis集群的TLS证书

    作为 Elasticache 的新手 我正在尝试从在不同 VPC 中运行的实例连接到它 当客户端位于基于 TLS 的 VPC 内时 它工作得很好 因为不需要传递 TLS 证书 我们只需要向 redis cli 传递 tls 选项 同样 当我
  • NSDate dateFromString 已弃用?

    我正在尝试使用 NSDate dateFromString 方法 但收到警告并且它导致应用程序崩溃 代码如下 NSString pickerDate NSString stringWithFormat timeSelector date N
  • 构建搜索应用程序的最佳实践? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我很快将开始一个简单的数据存储和搜索项目 基本上 其中之一是 将我巨大的 Excel 电子表格放入数据库 为其构建一个 Web GUI 并使其可搜索 类型的东西 困扰我的一件事是当用户输入
  • 如何从街道地址获取坐标

    我正在开发 Windows Phone 8 应用程序 但我找不到如何从地址获取坐标 问题是 我有我的坐标 我需要计算我和某个地址之间的距离 Windows Phone 8 没有太多记录 所以请帮助我 您正在寻找的称为 地理编码 将地址转换为
  • Grails:在运行时更改 dataSource url 以实现多租户数据库分离

    我正在使用 Grails 构建一个多租户应用程序 并且我想保留单独的数据库 我需要在运行时动态更改 url 以将 GORM 指向不同的数据库 我有一个前端充当平衡器 将请求分发到后端主机集群 每个后端主机运行一个 Grails 2 3 5
  • String.Format 在 TypeScript 中不起作用

    String Format不适用于TypeScript Error The property format does not exist on value of type prototype String fromCharCode code
  • 使用 TCP 连接获取字节数组

    我正在使用UDP发送 接收数据 但我现在想切换到TCP以避免数据包丢失 我读过一些关于TCP并注意到 而不是像使用 DatagramPacketUDP TCP使用输入流 输出流 我们如何从 DataInputStream 获取 byte 类
  • WordPress主题中通过$.ajax调用外部url

    我的 WordPress 应用程序托管在 url 上http 127 0 0 1 wordpress 我在 WordPress 标头中添加了以下脚本来获取一些令牌 但它没有给出任何令牌 我复制了该网址 http 127 0 0 1 8090
  • 如何用 Objective C 杀死一个线程?

    我调用了一个第三方 C 库 我已将其放入其自己的线程中 当前使用 NSThread 我想让用户能够停止该线程的执行 我很清楚这可能会导致的所有问题 但我仍然希望这样做 根据Apple 的线程编程指南 Cocoa 有可能这样做 iPhone
  • STL 中 UTF8 与宽字符的转换

    是否可以以独立于平台的方式将 std string 中的 UTF8 字符串转换为 std wstring 反之亦然 在 Windows 应用程序中 我将使用 MultiByteToWideChar 和 WideCharToMultiByte
  • 为每个发布环境转换 Azure 网站部署的 web.config

    在 Visual Studio Team Services 以前的 Visual Studio Online 中 我有三个发布环境 每个环境都有一个 Azure 网站部署步骤 我可以通过指定获取 Web Uat config 的 Build
  • 使用 solr 索引维基百科转储

    我的机器上安装了 solr 3 6 2 与 tomcat 完美运行 我想使用 solr 索引维基百科转储文件 如何使用 DataImportHandler 执行此操作 还有其他办法吗 我对 xml 没有任何了解 我提到的文件解压后大小约为
  • Hadoop中多个reducer如何只输出一个part-file?

    在我的map reduce 作业中 我使用4 个reducer 来实现reducer 作业 因此 通过这样做 最终输出将生成 4 个部分文件 part 0000part 0001part 0002part 0003 我的问题是 尽管hado
  • 对角带中的遍历矩阵

    我认为这个问题有一个简单的解决方案 几个 for 循环和一些奇特的计数器 但显然它相当复杂 所以我的问题是 你将如何 用 C 语言 编写对角条中方阵的函数遍历 Example 1 2 3 4 5 6 7 8 9 必须按以下顺序遍历 1 2
  • 与 NSPersistentContainer 的核心数据并发

    NOTE 我看过类似的问题 但没有找到描述这种情况的问题 我正在查看 Apple 提供的有关核心数据并发性的以下示例代码 https developer apple com library content documentation Coc