CoreData 崩溃,主队列上下文设置为私有队列上下文的子级

2023-12-07

我的问题是这样的。我想异步保存到磁盘。设置核心数据堆栈的代码如下所示。

- (NSManagedObjectContext *)managedObjectContext {
NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    NSManagedObjectContext *privateMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    [privateMOC setPersistentStoreCoordinator:coordinator];
    __managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    [__managedObjectContext setParentContext:privateMOC];


});
return __managedObjectContext;
}

当我执行这样的获取时:

NSMutableArray *result = [NSMutableArray array];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:[DataObject entityName]
                                          inManagedObjectContext:self.managedObjectContext];

[request setEntity:entity];
[request setPredicate:[NSPredicate predicateWithFormat:@"SUBQUERY(threadEntities, $emp, $emp.thread = %@).@count>0 AND tags.@count!=0", self, nil ]];
[request setPropertiesToFetch:@[@"creationDate", @"data"]];
[request setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]]];
NSError *error = nil;

[result addObjectsFromArray:[self.managedObjectContext executeFetchRequest:request error:&error]];

它因以下错误而崩溃:

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 375961053 beyond bounds [0 .. 7]'

另一方面,像这样的堆栈设置效果很好:

  - (NSManagedObjectContext *)managedObjectContext {
NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    __managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    [__managedObjectContext setPersistentStoreCoordinator:coordinator];
});
return __managedObjectContext;
}

数据库内部有一个 DataObject 和一些用于管理它的附加对象。问题是,为什么这次获取会受到影响,而应用程序之前使用相同参数执行的计数两次都有效?


看起来 CoreData 内部的某些内容变得不一致,就好像您也在处理错误的合并通知(在使用父子项时您不应该这样做,也不应该尝试!)。不幸的是,如果没有完整的堆栈跟踪,就很难重建这里发生的事情。

但是我没有看到reason在dispatch_once块内设置主队列上下文。上下文的成本很低,没有理由不在每次需要时生成一个新的子上下文 - 这是推荐的使用方式。一个NS管理对象上下文is:

NSManagedObjectContext 的实例代表单个“对象” 空间”或应用程序中的便签本。其主要职责是 管理被管理对象的集合。这些对象形成一个组 表示内部一致视图的相关模型对象 一个或多个持久性存储。

亲子:

当您在上下文中保存更改时,仅提交更改 “一个储存。”如果您保存子上下文,更改将推送到其 父母。这些更改不会保存到持久存储中,直到 根上下文已保存。 (根管理对象上下文是一个 父级为零。)此外,父级不会从 孩子们在它保存之前。如果需要,您必须保存子上下文 最终提交更改。

嵌套上下文使您采用 访问上下文的“传递接力棒”方法(通过传递上下文 从一个视图控制器到下一个)而不是检索它 直接来自应用程序委托。

如果您想查看设置父子上下文和使用队列限制的简单示例:https://github.com/quellish/QueuedCoreData

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

CoreData 崩溃,主队列上下文设置为私有队列上下文的子级 的相关文章

  • 为什么 Xcode 4 不会对我未完整实现 UITableViewDataSource 协议发出警告?

    如果我在 Xcode 中使用以下代码声明并不完全实现我自己的协议 一些协议 h protocol SomeProtocol
  • 如何在 Swift 3 中解析 JSON 数组 [重复]

    这个问题在这里已经有答案了 我从 Socket 获取了一些我想访问的数据 但收到错误消息 指出每次都无法将 NSArray 转换为 NSDictionary struct SocketEventHandler let event Strin
  • Swift 3:如何去除UITableView屏幕截图的灰色区域

    我在从桌面视图的屏幕截图中删除灰色区域时遇到了问题 这是我尝试截图时的输出UITableView 实际上我隐藏了一些tableViewCell这是不需要的 可能这就是区域显示灰色的原因 任何帮助表示赞赏 非常感谢 Answer 我通过使用
  • 自动布局、UIDynamics 和动画

    我对自动布局还很陌生 并且对如何为视图设置动画感到困惑 我读了很多 我知道你必须遵守限制 编辑它 然后包装layoutIfNeeded in an UIView动画块 但当真正要做的时候 我却有点失落 我很乐意有人能向我解释如何做这个动画
  • UITextFieldDelegate 与 UITextField 控件事件

    如果我想处理 UITextField 的更改 例如用户在其中键入 看起来这可以通过将委托分配给该文本字段 然后让委托实现 shouldChangeCharactersInRange 来完成 或者通过将目标添加到文本字段并处理 UIContr
  • iOS中的performSelector有什么用

    的作用是什么执行选择器 比较 self btnClicked and self performSelector selector btnClicked void btnClicked NSLog Method Called 两者都对我来说工
  • ITMS-90535 无法使用最新的 Google Signin SDK 发布 iOS 应用程序

    我正在使用 xcode 7 GM 种子并通过 cocoapods 安装了最新的 Google Signin SDKpod Google SignIn 当我尝试将我的应用程序发布到苹果应用程序商店时 我收到附加错误 Help 以下是 Goog
  • 如何检测Retina高清显示屏?

    UIScreen有一个新的 nativeScaleiOS 8 中的属性 但文档没有提及它 property nonatomic readonly CGFloat nativeScale 还有一个scale属性 但文档说它是 2 用于视网膜显
  • Objective Flickr 照片上传错误

    我正在使用 ObjectiveFlickr 库将照片从我的 iPhone 应用程序上传到 Flickr 我可以授权该应用程序并执行一般请求 但在尝试上传照片时遇到错误 要上传的照片是使用 AVFoundation 捕获的图像 这是相关代码
  • 在后台任务中安排通知

    我正在为 iOS 开发一个日历 闹钟应用程序 它与网络服务器同步 当在服务器上添加活动时 会发出推送通知 以便 iOS 客户端可以获取新数据 并根据需要更新和安排下一次警报的时间 本地通知 但这仅在应用程序在客户端打开时才有效 我希望客户端
  • 使用 Google place API 从 lat long 获取附近的地点

    我正在使用 google place API 即 https maps googleapis com maps api place search json location 33 7167 73 0667 radius 500 type f
  • 无法使用 Xamarin 和 WCF 访问 Web 服务

    我想使用 Xamarin 和 WCF 来使用公共 Web 服务 对于这个演示 我将使用Xamarin iOS 这是我试图使用的 公共 网络服务 http www webservicex net globalweather asmx WSDL
  • 避免“在此块中强烈捕获自身可能会导致保留周期”消息

    每次我必须在块内使用全局变量或属性时 如下所示 self save if isItSaving NO self saveMyFile 我必须像这样重写 BOOL iis isItSaving id myself self self save
  • 对使用phonegap和钛的质疑[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 最近我听说了 PhoneGap 和 Titanium 移动网络应用程序的开发 我分析了这两个 Web 应用程序 并了解了如何使用它们以
  • Swift 中通过不同类调用委托方法

    我正在获取 JSON 菜单 一旦 JSON 返回 我想运行 menuReady 来更新表的内容在 SomeTableViewController 类中 但下面的代码似乎不起作用 AIM Run 菜单就绪 JSON 返回后更新内容 PROBL
  • NSPredicate 的 onFormat 字符串

    我想用 id 键对数据进行排序 我如何理解格式字符串的用途NSPredicate格式 我有一个100号的帖子 我的代码 let objectIDs posts map 0 id let predicate NSPredicate forma
  • 在 iOS 上从 GPS 获取时间

    我正在开发一个跟踪器应用程序 该应用程序需要高精度地了解设备位置 即它使用位置服务并忽略水平精度低于 20 米的位置 CLLocation没有明确声明是否通过 GPS 确定 但是 如果水平精度为 20 米或更好 则可以认为它是来自 GPS
  • 退出导航控制器

    我试图离开初始视图控制器 并进入空白视图控制器 这很好 但是这会使空白视图控制器也成为导航控制器的一部分 这不是我想要的 我想脱离视图控制器 在视图控制器中 我尝试退出 它会自行弹出 当我尝试视图中的方法时 将出现目标视图控制器 self
  • 如何获取 UIWebView 中元素的位置?

    我在 iPad 程序中加载了 html 的 UIWebView 通过使用 webkit column width 我将 html 分为几列 padding 0px height 1024px webkit column gap 0px we
  • ResponseSerializer“无法使用 Swift 3 调用非函数类型“NSHTTPURLResponse”的值?

    我一直在使用以下代码 没有出现任何问题 直到更新到 Xcode 8 beta 6 它类似于这个例子 https github com Alamofire Alamofire generic response object serializa

随机推荐

  • RCurl,使用 API 密钥进行基本身份验证

    我曾经使用RCurl 来抓取需要登录的数据 现在我必须使用 api 密钥 以及用户 ID 密码 获取数据 并且它需要基本身份验证 Radian6 api http socialcloud radian6 com docs read Gett
  • 修复了 UIPickerView 选择栏中的标签

    在时钟应用程序中 计时器屏幕显示一个选择器 可能是一个UIPicker in UIDatePickerModeCountDownTimer模式 选择栏中包含一些文本 本例中为 小时 和 分钟 编辑 请注意 这些标签是fixed 当拾取器轮滚
  • django:将动态(reportlab)png提供给模板

    我花了一天的时间来解决这个问题 但没有成功 所以我们将不胜感激 我使用reportlab生成一个图表 并使用它成功将其渲染到浏览器tutorial d MyBarChartDrawing extract the request params
  • Prolog - 返回包含特定元素的列表?

    我正在尝试学习 Prolog 并且一直在做一些练习 有一张包含学生姓名的名单 写谓词filter L LN 返回名为的第二个列表LN其中包括这样的名称 filter kostas dimitris anna antonis antonia
  • defer() 不再允许可观察的返回类型

    今天我从 Angular 6 升级到 Angular 7 除此之外 我还必须将 rxjs 从 6 1 0 升级到 6 3 3 并将 typescript 从 2 7 2 升级到 3 1 1 现在这个 ngrx Effects 方法抛出一个打
  • .width() 给出错误 $(...)[0].width 不是函数?

    我有一个表 我试图找到表中每个 td 的宽度 我尝试过各种变体 td 0 width 但它们都不起作用 出现以下错误 Uncaught TypeError 0 width is not a function 每次 我首先导入 jQuery
  • 如何使用 IServiceCollection 和 NLog 将命名记录器通用 ILogger 作为 ILogger 注入构造函数

    我想注入通用实现ILogger
  • jQuery 多维数组(动态键) - 无法设置未定义的属性

    感谢乍得的解决方案 但是现在似乎清除了数组中的值 这是一个foreach在控制台日志上 它显示了我的情况 后面是更新功能的更新代码 timer html 60 timer html 57 0 timer html 58 undefined
  • 通过正则表达式获取文件路径中的最后一个反斜杠

    给定文件路径 例如 server folder A folder B etc more mov 我需要一个正则表达式来给我last反斜杠 这样我就可以提取实际的文件名 我的 尝试没有返回任何内容 我正在使用冷融合 建议 关于什么
  • 如何为数组编写 setter 和 getter? (c++)

    我在 C 中编写一个类 但是我不确定如何为数组创建 setter 和 getter 抱歉 这是一个基本问题 我收到以下错误 标记之前的预期主要表达式 这是我的代码 Class planet public body private strin
  • 查找连续出现次数最多的数字的算法 - C++

    我需要帮助制定一种算法来解决一个问题 有一行数字在该行中出现不同次数 我需要找到出现次数最多的数字以及它在该行中出现的次数 例如 1 1 5 1 3 7 2 1 8 9 1 2 那就是 1 它出现了 5 次 该算法应该很快 这是我的问题 有
  • rabbitmq 与 spring amqp - 消息在 AmqpException 情况下卡住

    我在我的消费者内部抛出 AmqpException 我的期望是消息将以 FIFO 顺序返回到队列 并在将来的某个时候重新处理 Spring AMQP 似乎没有将消息释放回队列 而是尝试一遍又一遍地重新处理失败的消息 这会阻止处理新到达的消息
  • 添加到下载列表 Android

    类中的以下函数DownloadManager将文件添加到下载数据库系统 因此它可以出现在下载应用程序中 从而有资格由下载应用程序管理 addCompletedDownload String title String description
  • 使用Qt时如何打印到控制台

    我正在使用 Qt4 和 C 来制作一些计算机图形学程序 我需要能够在运行时在控制台中打印一些变量 而不是调试 但是cout即使我添加库似乎也不起作用 有没有办法做到这一点 如果它足够好打印到stderr 您可以使用以下最初用于调试的流 in
  • PHP从特定位置附加到文件

    在 php 中 我打开一个文本文件并附加到它 但是我需要在文件末尾之前附加 3 个字符 换句话说 我需要从文件中的特定位置追加 写入 有人可以帮忙吗 此致 鲁本 您需要打开文件进行编辑 查找到所需的位置 然后写入文件 例如 进一步参考php
  • 在 Visual Studio 2013 的可用模板中添加项目

    如何在 Visual Studio 2013 可用模板的树视图中添加新的模板类型 如果单击 新建项目 在下一个打开的窗口的右侧窗格中 会显示 Visual Studio 提供的可用模板的列表 例如分类为 Visual C Visual C
  • 嵌套 ssh 中 bash shell 脚本中的命令行参数

    我正在尝试使用 1 2 变量 这些变量是我通过命令行传递给 bash shell 脚本的 我在 ssh 调用中使用这些变量 但似乎 ssh 内的变量没有被替换 外部的变量正在被替换 有什么解决办法吗 这是代码 bin bash ssh t
  • 如何在 BigQuery 中提取两个时间戳之间的唯一天数?

    对于两个不同的时间戳 假设时间戳 2015 02 01 和时间戳 2015 02 12 我想要一个包含其间所有日期的列 像这样 12行 2015 02 01 2015 02 02 2015 02 12 您可以通过公共数据集上的交叉联接来做到
  • 使用 ASP.NET MVC 3.0 进行日期验证

    我的 MVC UI 上有一个名为 startDate 的日期字段 用户使用 jquery 日期选择器选择日期 因为我想验证所选日期不应是过去 2 个月和未来 2 个月 我编写了以下代码来验证日期 public sealed class Da
  • CoreData 崩溃,主队列上下文设置为私有队列上下文的子级

    我的问题是这样的 我想异步保存到磁盘 设置核心数据堆栈的代码如下所示 NSManagedObjectContext managedObjectContext NSPersistentStoreCoordinator coordinator