【CoreData】parent-child关系ManagedObjectContext应用

CoreData 多线程下NSManagedObjectContext的使用 本人去年10月份才接触IOS项目的,项目中用到了CoreData,由于需要调用子线程进行API请求,所以需要在子线程中使用NSManagedObjectContext进行数据的增删改查。因此当时百度了很多相关东西,但是没有得到我要的答案,后来硬着头皮Google了很多英文博客和论坛(本人英文水平其实还可以,英文文档看起来也没那么吃力,但总归不是母语,到现在都有一种抵触感),研究的也是一知半解,由于 阅读详情

我们一开始使用CoreData框架和唯一的MOC进行应用的数据持久化的时候,如果创建项目的时候选择了“使用CoreData”,这会是XCode自动生成的模板代码的样子。

Xcode默认CoreData

同时,配合NSFetchedResultsController使用CoreData框架极大地简化了在各种各样的情况下使用tableview的麻烦。

有两种情形,我们想要CoreData多线程,或者使用多个MOC(ManagedObjectContext):  iOS5新提出了parent-child MOC大大简化了多线程使用CoreData的工作所以在这片文章就是讲使用新的父子MOC方法。

  1. 简化增加、编辑新的数据对象时的工作量。
  2. 避免阻塞用于UI更新的主线程。

 iOS5新提出了parent-child MOC大大简化了多线程使用CoreData的工作所以在这片文章就是讲使用新的父子MOC方法。


首先来复习一下单一MOC的设立

你需要一个PSC来管理和磁盘上数据库的交流。所以为了让PSC了解数据库是如何构造的,你需要一个数据模型。这个数据模型是由所有项目中的模型综合监理起来的。 之后,PSC设定在MOC的一个属性上。引出MOC第一定律:使用[MOC saveContext]会让带有PSC属性的MOC执行将修改写入磁盘的操作。

 

和这个图表一样。不论什么时候使用一个MOC进行增删改查,NSFetchedResultsController会被告知数据已经更新,并且通知TableViews来更新内容。这和MOC的保存方法相互独立。你可以想什么时候保存就什么时候保存,苹果的模板是在applicationWillTerminate的时候进行保存。

这个方法在大多数情况下好用,但是就像之前所说的两种情形,第一种与增改新的实体有关。你可能想要在增改实体的时候重用同一个viewcontroller。所以可能甚至会在view展现之前就插入了一个新的实体。但是这回导致NSFetchedResultsController通知tableview更新数据,所以可能的情况是在view展现之前会有一个空的单元格短暂出现。

第二种情况会当更新发生在savecontext之前而且数据保存会使用超过1/60秒的时间。在这种情况下用户界面会停止响应,直到保存结束,你会发现在页面滚动的时候发生了可见的页面跳动。

       两种情况都可以用多重MOC解决。


“传统”的多MOC方案

把每一个MOC想象成做出改动的草稿,在iOS5之前,使用CoreData需要监听其他MOC做出的改变,并且与之融合进主MOC当中。一个典型的设置会是这样的:

当在非主线程上创建临时MOC的时候,为了让数据能成功持久化,你需要将主MOC的PSC同样设置在临时MOC上,Marcus Zarra是这样解释的:

       尽管PSC不是线程安全的,但是MOC知道怎样正确的对之使用读写锁。所以,想搞几个MOC都行,只要设置同一个PSC来避免冲突。

 在非主线程使用saveContext会使数据写到磁盘上,而且也会触发NSManagedObjectContextDidSaveNotification。写成代码大概长这样。

创建一个临时MOC是嗖嗖的,所以不用担心频繁创建和销毁这些临时MOC的损失。这里的重点是所有临时MOC都设置和主MOC同样的PSC,这样就算在非主线程也能写入数据。

这里使用简化的方法来设立一个CoreData的存储。

现在考虑一下设置当触发didsave时的提醒回调函数。

一开始要避免融合主MOC自己的改动,之后如果在一个APP有多个数据库,也要避免保存到拎一个数据库去。最后使用mergeChangesFromContextDidSaveNotification  方法融合改动。Notification有一个字典保存了所有的改动,而且这个方法知道怎么做将其融合到MOC之中。


在不同的MOC之中传递实体对象(MO)

直接传递在两个不同的MOC当中得到的MO是绝对禁止的。但是有个简单的方法“映射”一个MO:通过它的ObjectID。这个ID是线程安全的,所以总是可以用它来获得MO,方法是objectWithID:, 会返回一个复制了的MO。


父子MOC

iOS5 使得MOC具有了一个属性:爹爹MOC。使用saveContext会将改变从儿子MOC直接推送到爹爹MOC去,而且不需要多余的指令。与此同时苹果赐予了MOC神奇地使用自己的同步、异步队列执行数据修改的能力。

队列的并行类型是在MOC的initWithConcurrencyType方法中初始化设置的。在下面这个图标当中我给一个爹爹MOC加了俩儿子MOC。

不论何时儿子MOC保存了一些改动,爹爹MOC都会知道,并且通知NSFetchResultsController对这些改变作出响应。但是这是数据还没写到磁盘上,因为儿子MOC(同时可能不是在主线程创造出来的MOC)并不知道PSC在哪,所以要持久写数据需要使用主MOC 在主队列上的saveContext方法。

第一个需要注意的地方是主MOC的类型是NSMainQueueConcurrencyType。在之前写的简单设立coreData存储的方法中,需要改变成这样。

一个多线程的数据操作会长这样:

每一个MOC 在进行数据操作的时候需要使用[MOC performBlock:(异步) /performBlockAndWait(同步)的方法。为啥呢,是因为每个MOC所在的线程或者队列是特定的,如果在非MOC创建的线程使用MOC进行数据处理是会出BUG的,因此使用这个方法,会自动迫使让你在正确的线程或者队列当中进行数据的操作。

注意儿子MOC是不会自动注意到爹爹的MOC的变化的,可以reload儿子MOC来同步这些改动,但是最多的情况下这些都不是事。只要主MOC得到了改动,那么fetchedcontroller会自动跟新,数据也会自动存储在磁盘上。

这个新的特性带来的最大的好处在于,你可以为任何一个带有保存或者取消功能的VC创建一个临时儿子MOC,如果把一个MO传递给这个MOC,用户就可以改动MO,如果他选择保存,就可以缓存所有的改动,如果他选择取消,那你啥也不用做因为所有的改动都会随着临时MOC被抛弃。

OK,脑子晕了吗?如果没有,现在有一整套多MOC的coredata实践


异步保存

Coredata 大神 Marcus Zarra 告诉我以下基于儿子/爹MOC的方法,增加了一个单独的写入用MOC。作为之前写方法的更新,那个方法还是有可能阻塞主线程。这个聪明的方法将写入保留在自己的非主队列当中,从而让界面继续如丝般顺滑。

这个方法还是蛮简单的,只要把PSC设置到我们新的私有写入MOC上,并且把主MOC设置成他的儿子MOC。

这样每做一次改变需要三次修改:临时MOC,主UIMOC 还有写入MOC。但是就像以前一样容易的是我们可以堆叠performBlocks. 用户界面永远不会因为长时间的写入而堵塞。


结论

iOS5 很牛地简化了非主线程队列使用CoreData的方法,使用父子MOC很容易就能实现并发存储。如果你还想支持ios3/4还是么问题的,但是如果iOS5是你支持的最低版本,那么就好办多了。

 


【MATLAB例程,无人机避障7】基于RRT*与人工势场法(RRT*+APF)的多无人机二维动态路径规划与避障 程序采用快速扩展随机树星算法(RRT*)与人工势场法(APF),实现四架无人机在二维动态障碍环境中的路径规划与协同避碰。通过RRT*的邻域选父和节点重连优化全局参考路径,利用APF进行局部动态避障,绘制全局路径、实际轨迹、安全净间隙、速度与加速度及航程等图像,对比RRT+APF与RRT*+APF的规划效果。无人机起终点、障碍物分布、采样次数及运动约束均可自行调整。 立即下载

相关推荐

【机械故障诊断】基于VMD分解与故障频率匹配的复合故障分离方法:MATLAB实现与智能运维应用 MATLAB 轴承复合故障分离|VMD分解与故障频率匹配

内容概要:通过结合变分模态分解(VMD)与理论故障频率匹配技术,实现对滚动轴承复合故障的自适应分离与精准诊断。该方法首先对振动信号进行稳健预处理,再通过参数寻优的VMD实现频带自适应分解,随后利用包络解调提取各模态的冲击周期,并基于轴承几何参数和转速计算理论故障频率。通过基频、倍频与边带的多证据匹配策略,将模态与外圈、内圈、滚动体、保持架等具体故障类型关联,支持共享模态的复合故障重构,最终输出各故障类型的独立分量与诊断结果。该方案提升了复杂工况下弱故障的识别能力与诊断的可解释性。; 适合人群:具备一定信号处理与机械故障诊断基础知识,从事工业设备状态监测、智能运维系统开发或相关算法研究的研发人员。; 使用场景及目标:①应用于电机、泵组、风电、轨道交通等领域的轴承复合故障诊断;②解决强弱故障共存、频率重叠导致的掩蔽问题,实现多故障的分离与识别;③为设备的智能运维、健康管理和剩余寿命预测提供可靠的故障分量数据与诊断依据; 阅读建议:此资源以MATLAB R2025b为实现平台,提供了完整的算法流程、代码示例与GUI界面。建议使用者在实践中重点关注参数搜索策略、多证据匹配的实现细节以及共享模态重构的逻辑,并结合实际工程数据进行验证和调优。

CoreData并发处理

iOS 5.0 苹果为CoreData的并发处理添加了两个内容。 首先介绍第一个: - (id)initWithConcurrencyType:(NSManagedObjectContextConcurrencyType)ct NSManagedObjectContextConcurrencyType 一共有三种: NSConfinementConcurrencyTypeNSP

Bmmboo的专栏 1381

基于.NET8开发,是一套开源、免费、跨平台、企业级在线考试软件,支持x64、x86、Arm64芯片架构的windows和linux操作系统,支持人大金仓、达梦、OceanBase数据库 等数据库

星期八在线考试系统,基于.NET8开发,是一套开源、免费、跨平台、企业级在线考试软件,支持x64、x86、Arm64芯片架构的windows和linux操作系统,支持人大金仓、达梦、OceanBase数据库 及 MySql、SqlServer、PostgreSql、SQLite 等数据库。

coreData详解

1、初识CoreData CoreData的结构构成: NSManagedObjectModel的构成:   可以通过Entity创建继承自NSManagedObject类的文件,这个文件就是开发中使用的托管对象,具备模型对象的表示功能,CoreData的本地持久化都是通过这个类及其子类完成的。   在CoreData的整体结构中,主要分为两部分。一个是NSManagedObjectConte...

weixin_34365635的博客 505

TC8测试TCP-UNACCEPTABLE-04/006

TC8测试TCP-UNACCEPTABLE-04/006

PSIM-串联谐振半桥LLC开关电源+PFM变频闭环控制【仿真+计算书+参考文献】

内容概要:本文档系统性地整合了电力电子与控制系统仿真领域的丰富资源,聚焦于基于PSIM和Simulink平台的串联谐振半桥LLC开关电源建模与仿真,深入探讨PFM变频闭环控制策略的设计与实现。内容涵盖LLC谐振变换器的工作原理、关键参数设计、开环与闭环仿真模型构建、软开关技术(ZVS/ZCS)、恒压恒流双竞争控制机制以及调频控制等核心技术,配套提供完整的仿真文件、计算书和参考文献,有助于深入理解高频开关电源系统的动态响应特性与稳定性分析方法。此外,文档还汇集了大量拓展性仿真资源,涉及双向DC-DC变换器、PWM整流器、PFC电路、储能系统、微电网优化、DAB变换器、并网逆变器等多个方向,构成一套完整的科研与工程实践参考资料体系。; 适合人群:适用于电力电子、电气工程及其自动化等相关专业的高校本科生、研究生,以及从事开关电源设计、新能源系统开发、电力变换器研发等工作的工程技术人员。; 使用场景及目标:①深入学习LLC谐振变换器的拓扑结构与闭环控制原理;②掌握PSIM/Simulink在电力电子系统中的高精度建模与仿真技能;③为科研项目、学位论文或产品开发提供可复用的技术方案与代码基础;④深化对PFM控制、软启动过程、ZVS/ZCS实现机制及系统稳定性的理解; 阅读建议:建议结合文档中提供的仿真模型与计算书进行同步操作,优先剖析主电路拓扑与控制逻辑架构,再逐步开展参数调节与仿真验证实验,同时可参考所列相关资源拓展技术视野,提升综合设计能力。

CoreData数据持久

CoreData数据持久化 概念 CoreData是Apple官方为iOS提供的一个数据持久化方案,其本质是一个通过封装底层数据操作,让程序员以面向对象的方式存储和管理数据的ORM框架(Object-Relational Mapping:对象-关系映射,简称ORM)。虽然底层支持SQLite、二进制数据、xml等多种文件存储,但是主要还是用来操作SQLite数据库。 NSManagedObjectContext 是托管对象上下文,数据库的大多数操作是在这个类操作 NSManagedObjectM

LuodeCoding的博客 501

Windows开发工具环境管理:Git、Node.js、Python多版本与PATH冲突排查 - 配套实验资源

本资源是《Windows开发工具环境管理:Git、Node.js、Python多版本与PATH冲突排查》的配套实验工具,适用于 Windows PowerShell 5.1 和 PowerShell 7,帮助开发者排查 Git、Node.js、Python、Codex 等工具的多版本共存、PATH 配置异常及命令优先级冲突问题。 **资源包含两个 PowerShell 脚本:** 1. **Get-ToolchainInventory.ps1**:只读环境诊断工具,可列出开发工具的命令候选路径,检查 PATH 目录、重复条目及无效路径。不执行开发工具,也不修改系统配置。 2. **Invoke-PathPrecedenceLab.ps1**:PATH 优先级演示工具,在系统临时目录中生成测试命令,通过临时调整当前进程的 PATH,直观展示 Windows 命令查找与优先级规则。实验结束后自动恢复 PATH 并清理自身创建的临时文件。 **资源特点:** - 兼容 Windows PowerShell 5.1 和 PowerShell 7。 - 支持开发工具路径盘点与 PATH 冲突分析。 - 提供可重复的命令优先级实验。 - 不修改注册表、系统级或用户级环境变量。 - 不卸载软件、不安装依赖、不执行包管理器。 - 适合 Windows 开发环境排查、PowerShell 学习与技术教学。 **使用说明:** 下载后建议先审查脚本,再按照配套文章中的 PowerShell 命令运行。脚本已完成静态检查与打包,尚未经过 Windows 实机执行验证。 **安全提示:** 诊断结果可能包含个人或组织目录信息,公开分享前请脱敏。若受到 PowerShell 执行策略限制,应采用符合环境安全要求的授权方式运行,不建议全局关闭安全限制。

IOS-CoreData的使用详解

前言:很多小的App只需要一个ManagedContext在主线程就可以了,但是有时候对于CoreData的操作要耗时很久的,比如App开启的时候要载入大量数据,如果都放在主线程,毫无疑问会阻塞UI造成用户体验很差。通常的方式是,主线程一个ManagedContext处理UI相关的,后台一个线程的ManagedContext负责耗时操作的,操作完成后通知主线程。使用CoreData的并行主要有两种方

Try My Best! 1090

PHY6252开发实战:从零构建BLE串口透传应用

本文详细介绍了PHY6252开发板在BLE串口透传应用中的实战经验,包括开发环境搭建、BLE串口透传例程解析、AT指令集实现与扩展、数据透传机制优化以及常见问题排查指南。通过智能家居遥控器项目案例,展示了PHY6252在低功耗物联网设备开发中的实际应用。

weixin_29183637的博客 311

华为铁三角(AR、SR、FR)的考核指标设计

以和为核心,通过和实现协同。考核维度分为和,并随市场阶段动态调整权重。

从技术实践立足,从项目管理方法论延伸思考 2768

CoreData 框架简介(一)

CoreData 框架简介(一) 这是该系列文章的第一篇,总体上介绍一下CoreData,目的是让我们对其概念和使用有个初步的印象和了解。 iOS3.0引入的CoreData,用于本地存储和检索持久化数据;CoreData是一个功能强大的对象数据库,提供了强大的数据存储和管理能力。 CoreData能将对象映射到关系数据库,让你在编写对象业务逻辑时,无需创建数据库,也不用编写持久化逻

baby_hua的专栏 1287

从CD4051到现代模拟开关:40年芯片演进史与选型避坑指南

本文回顾了从CD4051到现代模拟开关的40年技术演进,详细对比了导通电阻、带宽等关键参数的显著提升。通过实际案例和选型矩阵,揭示现代模拟开关在精度、功耗和集成度方面的优势,并提供高精度测量、电池供电等场景的选型策略与避坑指南,帮助工程师优化设计。

weixin_42543046的博客 153

认识CoreData-基础使用

    第一篇文章中并没有讲CoreData的具体用法,只是对CoreData做了一个详细的介绍,算是一个开始和总结吧。 这篇文章中会主要讲CoreData的基础使用,以及在使用中需要注意的一些细节。因为文章中会插入代码和图片,内容可能会比较多,比较考验各位耐心。   文章中如有疏漏或错误,还请各位及时提出,谢谢!

weixin_34291004的博客 320

ESP32C3的I2S接口详解:以驱动PCM5102A为例,避开时序与配置的那些坑

本文深入解析ESP32C3的I2S接口驱动PCM5102A DAC的完整解决方案,涵盖时序对齐、PCB优化和寄存器级配置。通过实际案例分享时钟树分析、信号完整性设计和底层调试技巧,帮助开发者避开常见陷阱,实现高质量音频输出。重点探讨了I2S协议栈、电源滤波优化及DMA传输异常处理等关键技术要点。

weixin_30254435的博客 298

具身智能端到端大模型VLA (Vision Language Action)

在语言为条件的机器人任务中,策略必须具备理解语言指令、视觉感知环境并生成适当动作的能力,这就需要VLA的。例如,在自动驾驶领域,传统的做法是将感知、预测、规划等步骤分开处理,而VLA则试图用一个统一的框架来替代这种分立的方法。另外,VLA的模型对于算力的需求很大,单片AI算力1000Tops的Thor大概率会延期发布,加上英伟达芯片的量产时间与成本挑战,以及在国内的应用情况,对车企而言是个大问题。以谷歌DeepMind推出的RT-2为例,该模型可以在新的物体、背景和环境中表现出显著改善的性能。

具身智能机器人 1万+

CoreData

一、概述 Core Data框架提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite3数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,不需要编写任何SQL语句。使用此功能,要添加CoreData.framework和导入主头文件。 二、相关内容及功能 1、NSManagedObject 通过Core Dat

于海明的博客 2579

【安全启动】HSM安全启动系统学习指南

HSM安全启动系统学习指南摘要 本指南为工程师提供关于HSM安全启动的系统性学习路径,以英飞凌AURIX TC377芯片为核心案例,涵盖基础理论、芯片实现、开发实践和行业应用四个阶段。安全启动作为设备信任链的起点,在汽车电子和工业控制领域尤为重要。指南详细解析了TC377的HSM架构、UCB/PROCON配置、密钥管理等关键技术,并提供了从开发到认证的全流程指导。特别关注汽车行业合规要求(如ISO/SAE 21434、UN R155),帮助开发者构建安全可靠的启动系统,规避常见工程陷阱。通过四阶段渐进学习,

weixin_46481662的博客 515

Core Data - 个人总结

1. 运用 state 参数 + Notification 以同步保存数据的过程, 因为保存entity是有时间的。例如避免拿到 temporary Id (临时ld)而你可能想得到的是real objectId。 正确的做法是利用Notification监听,保存完毕后更改state进行下一步 (这时候已经确定是 real id)。 [[NSNotificationCenter default

巍的博 1304

微信小程序|基于小程序实现人脸识别对比

此文主要通过小程序实现对比人脸相似度,并返回相似度分值,可以基于分值判断是否为同一人。人脸登录、用户认证等场景都可以用到。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 2万+

光学材料仿真软件:FDTD Solutions_(4).材料属性的定义与应用

在光学材料仿真软件中,材料属性的定义和应用是至关重要的一步。正确地定义材料属性可以确保仿真结果的准确性和可靠性。本节将详细介绍如何在FDTD Solutions中定义和应用不同的材料属性,包括介质材料、金属材料、色散材料等,并提供具体的代码示例和数据样例。介质材料是光学仿真中最常见的材料类型之一。在FDTD Solutions中,可以通过多种方式定义介质材料,包括使用预定义的材料库、自定义材料参数或导入材料数据文件。FDTD Solutions内置了一个丰富的材料库,包含了许多常用材料的光学性质。

kkchenjj的博客 1400

第三篇《iOS CoreData创建managedObjectContext失败》

今天继续,还是坑,在用core data 的时候报错了,话不多说直接上代码! -(void)saveWithDeviceToken:(NSString *)deviceToken ClientId:(NSString *)clientId ClientKey:(NSString *)clienKey{ NSL

wolf0532的博客 1268

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Core Data线程安全及BUG解决

1.Core Data线程安全问题:       在一些简单项目中,一般只需要一个ManagedContext在主线程就可以了,但对于复杂项目来说,如果都放在主线程, 面对大数据量的读写必然阻塞主线程,用户体验极差。ManagedContext不是线程安全的,如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext,每个NSManagedObj

x534600451的博客 760

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

CoreData多线程安全

CoreData中的NSManagedObjectContext在多线程中不安全,如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext, ,每个NSManagedObjectContext对象实例都可以使用同一个NSPersistentStoreCoordinator实例,这个实例可以很安全的顺序访问永久存储,这是因为NSManagedOb...

weixin_34233421的博客 180

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

iOS CoreData的使用以及coreData中的多线程问题(一)

CoreData的使用1.coreData简介      coreData是苹果对sqlite的封装,不用操作sqlite语句,他提供了对象关系映射功能,能将oc对象转化成数据,保存在sqlite中,也能将保存的数据还原成oc对象;      coredata有两种队列:私有队列,主队列       coreData中的主要包括这几个部分:管理对象上下文,数据持久化协调器,模型文件(包含实体,实体...

代码解释生活 6528
上一篇: 项目中如何添加CorePlot开源框架(重温Xcode链接静态库)
下一篇: CocoaPods安装和使用教程
perfeter
博客等级 码龄13年 0粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值