核心数据多线程取记录

2023-11-30

我对 CoreData 中的多线程有一个疑问。如果我们使用多线程,我们应该使用单独的 NSManagedObjectContext 来插入新数据或更新,否则我们可以使用父子上下文方法。但我只是创建新的 NSManagedObjectContext 。我的问题是 - 即使在后台线程中,我也应该使用单独的 NSManagedObjectContext 进行提取吗?如果不是(即我们只能使用主队列 NSManagedObjectContext)那么为什么我会收到 __psynch_mutexwait 错误?

Thanks


首先,Core Data 是线程安全的。但您必须遵守以下规则:

  1. NSManagedObjectContext是线程绑定的。您只能在分配给它的线程上使用它。-init导致将上下文分配给创建它的线程。使用-initWithConcurrencyType:将允许您创建与其他线程/队列关联的上下文。
  2. Any NSManagedObject与一个相关联NSManagedObjectContext与它来自的上下文绑定到相同的线程/队列
  3. 没有第三条规则

你可以通过NSManagedObjectID线程之间的实例,但必须遵守规则 1 和 2。根据您的描述,我认为您违反了这些规则。

就我个人而言,我也不建议使用 NSManagedObjectID。有更好的解决方案。 ——马库斯·S·扎拉

Marcus,这是我读过的对 Core Data 线程的最简洁的解释。自从它推出以来,我一直在使用它,有几天我仍然弄错了这些规则!您提到“更好的解决方案”——您能详细说明一下吗?

我对使用NSManagedObjectID。在许多情况下,从一个应用程序生命周期到另一个应用程序生命周期,它并不保持不变。最初,根据文档,我们(一般 Cocoa 开发人员)认为这是为我们生成的神话主键。事实证明这是不正确的。

在具有父母/孩子背景的现代发展中,情况更加令人困惑,并且有一些有趣的陷阱需要我们警惕。考虑到目前的情况,我比以前更不喜欢它。那么我们用什么呢?

我们应该自己生成。不需要太多。如果您的数据还没有来自服务器的主键(很常见的是有一个id从基于 Ruby 的服务器)然后创建一个。我喜欢这样称呼它guid然后有一个-awakeFromInsert与此类似:

- (void)awakeFromInsert
{
  [super awakeFromInsert];
  if (![self primitiveValueForKey:@"guid"]) {
    [self setPrimitiveValue:[[NSProcessInfo processInfo] globallyUniqueString] forKey:@"guid"];
  }
}

NOTE:此代码是在网络浏览器中编写的,可能无法编译。

您检查该值是因为-awakeFromInsert每个上下文调用一次。然后我一般都会有一个方便的方法NSManagedObject类似的实例:

@implementation MyManagedObject

+ (MyManagedObject*)managedObjectForGUID:(NSString*)guid inManagedObjectContext:(NSManagedObjectContext*)context withError:(NSError**)error
{
  NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:[self entityName]];
  [fetch setPredicate:[NSPredicate predicateWithFormat:@"guid == %@", guid]];

  NSArray *results = [context executeFetchRequest:request error:error];
  if (!results) return nil;

  return [results lastObject];
}

@end

NOTE:此代码是在网络浏览器中编写的,可能无法编译。

这将错误处理和上下文/线程控制留给了开发人员,但提供了一种方便的方法来检索当前上下文中的对象,并让我们将对象从一个上下文“弹跳”到另一个上下文。

这比-objectWithID:应谨慎使用,并且仅在保存将对象向上移动到堆栈后需要将对象从一个上下文弹回到另一个上下文的情况下使用。

就像我做的大多数事情一样;这不是通用解决方案。这是一个应该根据每个项目进行调整的基线。

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

核心数据多线程取记录 的相关文章

随机推荐

  • VBA - 将条件评估为字符串

    我遇到过一个非常奇怪的场景 在函数中 我将收到一串要评估的条件 E g a gt b and b 2 or c 3 其中 a b 和 c 是我的变量名 我尝试并搜索了很多 但没有得到任何有意义的东西 所以我的问题是 是否可以评估这样的字符串
  • 每天下午 5 点重复 UILocalNotification

    如何每天下午 5 点重复 UILocalNotification 以下是我设置自定义时间的代码 但我想每天在自定义时间或可能是静态时间通知用户 我使用的是 iOS 6 void scheduleNotification NSDateForm
  • xpath 表达式“html/body/div/text()[1]”的结果是:[object Text]。使用 Selenium 打印元素文本应该是元素错误

    我正在尝试从此示例 HTML 中提取 479 div 479 Miles Away div 我在 Python 中使用以下 Selenium 代码 xpath html body div text 1 WebDriverWait drive
  • 将 dict 的元组键转换为新的 dict

    我有一个dict像这样 America 25 m IT 10000 America 22 m IT 8999 Japan 24 f IT 9999 Japan 23 f IT 9000 现在 我想用密钥获取所有结果 America m IT
  • 以管理员身份从 Java 运行 Windows 命令行 - 创建 .manifest 文件

    我正在运行 Windows 7 Pro 并在 Eclipse 中开发 Java 应用程序 我需要 Eclipse 将用户指定的命令 例如 chkdsk C 发送到命令提示符 然后将命令提示符打印的任何内容输出到 Eclipse 中的控制台
  • Log4j 配置(基于大小)不起作用

    我有我的申请 以下条目是在Log4j属性文件 基于大小的滚动不适用于此应用程序 文件在 5 MB 时不会滚动 应用程序会继续记录并以 GB 为单位进行记录 一次运行会生成大约 6 MB 的日志 应用程序每天运行多次 有人可以帮助指出我在哪里
  • ember 数据序列化器数据映射

    我正在使用 ember 和 ember data 尝试使用来自服务器的 json feed 这是我的代码 App Ember Application create DS RESTAdapter configure plurals categ
  • 从 pdf 中获取页面并使用 itext 将其保存为图像文件

    有一个pdf文件 我想将第二页作为图像导入并将其保存为jpeg文件 是否可能以及如何做到 这是我导入页面的代码 Document document new Document File file File createTempFile Pdf
  • C中Char到int的转换

    如果我想转换单个数字char为其数值 例如 如果 char c 5 而且我要c持有5代替 5 这样做是100 便携吗 c c 0 我听说所有字符集都按连续顺序存储数字 所以我假设是这样 但我想知道是否有一个有组织的库函数来执行此转换 以及按
  • 可空外键不好的做法?

    假设您有一个 Orders 表 其中包含一个指向 Customer Id 的外键 现在 假设您想添加一个没有客户 ID 的订单 这是否可能是另一个问题 您必须将外键设置为 NULL 这是不好的做法还是您宁愿使用之间的链接表订单和客户 虽然关
  • 如何对 DRF 中序列化器自定义字段的值进行排序

    我在客户端序列化程序中创建了一个自定义字段 该字段的值是通过复杂的序列化器方法计算的 class ClientsStatsSerializer serializers ModelSerializer Serializer shows tot
  • 计算大数据的相异矩阵

    我正在尝试基于具有数值和分类特征的大数据框架计算相异矩阵 当我运行daisy函数从集群包我收到错误消息 错误 无法分配大小为 X 的向量 就我而言 X 约为 800 GB 知道我该如何处理这个问题吗 此外 如果有人可以帮助我在并行核心中运行
  • Angular PrimeNG p-table:向特定列添加自定义排序功能

    我正在使用 PrimeNG 的 p 表 该表当前在两列上有默认排序 但第三列数据应该按状态排序 高 中 低 现在我需要对此列实现排序 但这必须是基于自定义逻辑的排序 我知道 p table 在表级别提供此功能 但我不确定在列级别 如下所示
  • 为什么包含prototype.js会破坏jquery bbq的功能?

    I have
  • IE < 9 不支持 $("").attr("src",something).load() ?

    http jsfiddle net DerekL qDqZF img attr src http derek1906 site50 net navbar images pic3 png load function body html don
  • 如何将文件复制/替换到 VB.NET 中的文件夹中?

    I used File Copy source target True where source是完整路径名 例如c source txt and target是一个文件夹 其中可能包含同名文件 我想复制source txt到目标文件夹并覆
  • 文件浏览器访问 Chrome 的沙盒文件系统

    我正在编写一个 Google Chrome 应用程序 它使用 HTML5 文件系统 API 在本地存储内容 有什么方法可以使用 Windows 资源管理器访问 Chrome 存储这些文件的目录 还是完全虚拟且无法从应用程序外部访问 我无法通
  • Android解析json树

    我有树形 JSON 结构数据 就像是 result id 1 name test1 id 2 name test12 children id 3 name test123 children id 4 name test123
  • 如何保护 Android 资产文件夹免受黑客攻击

    如何保护 Android 资产文件夹免受黑客攻击 有什么方法可以保护assets文件夹吗 您保存的任何内容Asset仅当您将其复制到内部或外部缓存目录中后才能访问该文件夹 因此 您无法同时保护它免受剥削者的侵害 但是 您可以将此文件夹中的任
  • 核心数据多线程取记录

    我对 CoreData 中的多线程有一个疑问 如果我们使用多线程 我们应该使用单独的 NSManagedObjectContext 来插入新数据或更新 否则我们可以使用父子上下文方法 但我只是创建新的 NSManagedObjectCont