CoreData 深入理解2 (iOS5 以后线程安全与同步)

iOS CoreData详解(五)多线程 原创blog,转载请注明出处 blog.youkuaiyun.com/hello_hwc 欢迎关注我的iOS SDK详解专栏,这里有很多基础的文章 http://blog.youkuaiyun.com/column/details/huangwenchen-ios-sdk.html前言:很多小的App只需要一个ManagedContext在主线程就可以了,但是有时候对于CoreData的操作要耗时很久的,比如App开 阅读详情

I've seen a few videos / threads that say it's possible to create 'children' MOCs -- MOCs that use other MOCs as their persistant stores. Useful, for example, in a context where you're threading your application, and want to have a single master MOC that can save / rollback the changes that the child threads create. (From what I understand, a MOC and it's managedObjects MUST all be used on the same thread)

The question is, how do I create a child MOC? I can't track down the WWDC videos I was watching that introduced them, and everything I"ve seen has been talking about how to use them ONCE they're made. I can easily alloc a new MOC, but how do I set it's persistent store to be another MOC? The reference doesn't show any functions that do that!

share | improve this question
  add comment

2 Answers

up vote 16 down vote accepted

Create a new MOC for which you are in total control of the synchronization. This is the same as calling init and the same behavior as pre-parent/child relationships.

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
       initWithConcurrencyType:NSConfinementConcurrencyType];

You parent a MOC to another MOC by setting its property:

moc.parentContext = someOtherMocThatIsNowMyParent;

Here, the child chooses the parent. I'm sure my kids wish they were NSManagedObjectContexts. A parent context must be of either NSPrivateQueueConcurrencyType or NSMainQueueConcurrencyType.

You can create a MOC that is "bound" to a private queue:

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

which means you should only access it via the performBlock or performBlockAndWait API. You can call those methods from any thread as they will ensure proper serialization of the code in the block. For example...

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
       initWithConcurrencyType:NSPrivateQueueConcurrencyType];
moc.parentContext = someOtherMocThatIsNowMyParent;
[moc performBlock:^{
    // All code running in this block will be automatically serialized
    // with respect to all other performBlock or performBlockAndWait
    // calls for this same MOC.
    // Access "moc" to your heart's content inside these blocks of code.
}];

The difference between performBlock and performBlockAndWait is that performBlock will create a block of code, and schedule it with Grand Central Dispatch to be executed asynchronously at some time in the future, on some unknown thread. The method call will return immediately.

performBlockAndWait will do some magic synchronization with all the other performBlock calls, and when all the blocks that have been presented prior to this one are done, this block will execute. The calling thread will pend until this call has completed.

You can also create a MOC that is "bound" to the main thread, just like private concurrency.

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
       initWithConcurrencyType:NSMainQueueConcurrencyType];
moc.parentContext = someOtherMocThatIsNowMyParent;
[moc performBlock:^{
    // All code running in this block will be automatically serialized
    // with respect to all other performBlock or performBlockAndWait
    // calls for this same MOC.  Furthermore, it will be serialized with
    // respect to the main thread as well, so this code will run in the
    // main thread -- which is important if you want to do UI work or other
    // stuff that requires the main thread.
}];

which means you should only access it directly if you know you are on the main thread, or via the performBlock or performBlockAndWait API.

Now, you can use the "main concurrency" MOC either via the performBlock methods, or directly if you know you are already running in the main thread.

share | improve this answer
 
 
Thank you for such an (incredibly) thorough answer. –   RonLugge  Sep 4 '12 at 22:15
 
Hello, I know it's really old but my question isn't big enough to create a new one, I was wondering where I should call save on the context, inside the performBlock or outside ? Thank you ! –   ItsASecret  Oct 12 '13 at 16:15
 
Inside performBlock –   Jody Hagins  Oct 16 '13 at 1:57
add comment

Initialize child MOC then:

[_childMOC performBlockAndWait:^{
            [_childMOC setParentContext:parentMOC]; 
 }];
share | improve this answer
 
 
So... I can ACCESS MOCs accross threads, I'm just not allowed to operate (insert, delete, save, rollback) accross them? –   RonLugge  Sep 4 '12 at 21:46
1  
You can call performBlock and performBlockAndWait from other threads. Not much else. –   Jody Hagins  Sep 4 '12 at 22:11 
iOS CoreData详解(六)深入理解数据模型 原创Blog,转载请注明出处 blog.youkuaiyun.com/hello_hwc 之前的五篇文章 1. 堆栈与基本概念 2. 基本操作 3. 与Tableview协作-NSFetchedResultController 4. CoreData原理Faulting and Uniquing 5. CoreData与多线程前言:Coredata是一个良好的对象图管理工具。那么对象图 阅读详情

相关推荐

全面的iOS开发者指南:从基础到进阶

Xcode 的界面布局和定制为开发者提供了高效的工作空间,而其调试工具则简化了代码调试和问题诊断的过程。除了使用UIKit提供的标准控件外,开发者还可以创建自定义控件来满足特定需求。自定义控件通常会继承自UIView,并添加特定的行为和样式。创建自定义控件涉及到以下步骤:定义新的类,继承自UIView。实现初始化方法,创建子视图和设置布局。重写draw(_:)方法来绘制自定义图形或使用Core Graphics等绘图API。

weixin_42510243的博客 1366

CoreData常见崩溃问题,Swift开发者如何避坑?

解决Swift数据库操作常见崩溃,本文深入解析CoreData使用陷阱与避坑策略,涵盖上下文管理、线程安全与模型迁移等关键场景。掌握正确操作方法,提升数据稳定性,Swift开发者值得收藏。

LiteTrans的博客 593

Swift编程实战:全面掌握iOS应用开发

Swift是苹果公司在2014年推出的编程语言,用于开发iOS、macOS、watchOS和tvOS应用程序。作为替代Objective-C的新语言,Swift拥有简洁的语法和现代化的编程特性,支持面向对象编程,同时也融入了函数式编程的理念。在Swift中,类(Class)是一种结构体,用于定义对象(Object)的属性和方法。对象是类的实例,类是描述具有相同属性和方法的对象的蓝图。下面是一个简单的例子来说明Swift类的定义:var关键字用于定义属性,它们的值可以改变。init。

weixin_36303807的博客 911

Core Data线程安全及BUG解决

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

x534600451的博客 760

从Palantir到AI时代:Forward Deployed Engineer模式的深度解析

《从Palantir到AI时代:FDE模式的创新与挑战》摘要:Palantir开创的前置部署工程师(FDE)模式正在成为AI创业公司的标配。该模式通过现场工程师深入了解客户需求,填补产品与实际应用间的鸿沟,颠覆了传统SaaS规模化路径。核心优势在于将定制化服务转化为产品发现机制,特别适合高度异质化的AI市场。成功关键在于平衡定制与标准化,通过合同价值增长、产品杠杆效应等独特指标衡量成效。FDE人才需要兼具领域洞察力与快速原型能力。这一模式表明,在AI等新兴领域,深入客户现场可能比单纯追求技术突破更能创造商业

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 4539

Halcon-AOI外观缺陷检测系列

Halcon-AOI外观缺陷检测系列

Jumy_S的博客 1667

coreData 深入理解3 (iOS5 以前线程安全与同步)

iOS5 以前采用方法: 1: 主线程修改了数据库的某一条记录,但是子线程没有发生变化,反过来一样的问题。这种情况一般是发生在app有多个NSManagedObjectContext,两个线程分别对其进行了读写操作。 2: 有时候程序会莫名其妙的crash掉,这个有很多原因:           a: 有时候是因为两个线程同时读写数据库中的同一条记录。    

fhbystudy的专栏 1733

FOC电机控制中电流采样延迟补偿的原理和方法

摘要: FOC电机控制中,电流采样、计算与PWM更新存在固有延迟(约1.5个PWM周期),导致相位滞后,限制电流环带宽。主流补偿方法包括: 一阶前向预测法:基于历史电流值预测未来电流,抵消延迟,工程应用广泛; 相位超前补偿:通过s/z域校正器设计实现等效预测; 状态观测器法(如龙伯格观测器):通过电机模型闭环估计状态,兼具噪声抑制和参数辨识能力,但复杂度高。实际需注意参数敏感性、离散化精度及延迟时间校准,避免过补偿风险。一阶预测法因平衡效果与复杂度成为工业首选。

jifengzhiling的博客 2232

iOS CoreData (一) 增删改查

Core Data是iOS5之后才出现的一个框架,本质上是对SQLite的一个封装,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象,通过CoreData管理应用程序的数据模型,可以极大程度减少需要编写的代码数量! 更新于2018.3.7   iOS CoreData (二) 版本升级和数据库迁移 ...

weixin_33686714的博客 160

Android 集成 Google 与 Facebook 第三方登录实战详解(2024版)

本文详细介绍了2024年Android应用集成Google与Facebook第三方登录的完整实战指南。通过分步教程和代码示例,帮助开发者快速实现一键登录功能,提升用户体验和注册转化率,同时涵盖隐私合规和常见错误处理的最佳实践。

blue的专栏 822

华为OD机试 - 城市聚集度(Python/JS/C/C++ 2025 A卷 200分)

华为OD机试 2025A卷题库疯狂收录中,刷题。

学Java,找哪吒 1131

iOS面试2

转:http://www.cocoachina.com/ios/20151106/14069.html 作者:seedante 授权本站转载。 题目来自博客:面试百度的记录,有些问题我能回答一下,不能回答的或有更好的回答我放个相关链接供参考。 唐巧前辈说这些都是 iOS 的基础问题,应该对此深入的了解。当初看到时,大部分回答不上来,因为平时没有好好思考整理过。这里大部分的概念大多会在学习...

weixin_33935777的博客 91

Android16 RK3576 Bluetooth source和sink模式切换

摘要:本文介绍了在RK3576平台上实现蓝牙A2DP模式动态切换的修改方案。通过在device配置文件中添加A2DP Sink相关属性,修改Bluetooth模块代码实现:1)在Config.java中增加persist.bluetooth.rka2dpsink属性控制模式切换;2)修改A2dpSinkStreamHandler.java取消音频焦点限制;3)调整btif_a2dp_sink.cc默认授予音频焦点。最终通过设置persist.bluetooth.rka2dpsink属性为true/false

tzj1058756809的博客 860

探索iOS开发语言基础与Xcode工具:从零开始构建你的第一个iOS应用

在当今移动应用广泛普及的时代,iOS开发成为了许多程序员追求的目标。无论你是一个新手开发者,还是有经验的编程高手,理解iOS开发的基础语言和掌握Xcode这个强大的工具都是至关重要的。本文将详细介绍iOS开发所需的语言基础以及Xcode工具的使用,帮助你从零开始构建你的第一个iOS应用。

4151

基于MATLAB的小波包分解(WPD)算法详解

本文详细介绍了基于MATLAB的小波包分解(WPD)算法。WPD作为信号处理领域的重要技术,继承并发展了小波分析的优点,通过正交镜像滤波器组将信号分解为不同频率子带,形成完整的二叉树结构。相比传统小波变换,WPD具有更精细的频带划分、自适应基选择能力和更高的灵活性,特别适合分析非平稳信号。文章系统阐述了WPD的数学原理、算法实现流程及其在机械故障诊断、生物医学信号处理等领域的应用。通过MATLAB代码示例展示了WPD的具体实现方法,并分析了不同参数设置对分解效果的影响,为工程实践提供了有价值的参考。

qq_42212808的博客 292

ORB-SLAM3代码详解 - 第 18 篇 · Atlas 多地图系统、地图保存与全系统调优

会跑:理解三线程架构与数据流(01/08/10/13),能编译、配参、复现各数据集结果。会改:掌握相机模型抽象(05)、g2o 顶点与边(14)、预积分(15),能接入新传感器、新相机、新约束。会调:理解每个参数背后的物理含义与耦合(03/15/16/18),能针对自己的平台与场景做精度/实时/鲁棒的权衡。ORB-SLAM3 的价值不止于一个可用的 SLAM 系统,更在于它是一套工程化的几何状态估计模板:清晰的模块边界、可替换的相机/传感器抽象、紧耦合优化的标准范式。

PX4-SLAM-PNC 172

[iOS知识简记]-题库走查2

https://www.jianshu.com/p/d884f3040fda 这里的题库走查。 iOS 2 Objective_C语言特性相关问题 https://www.jianshu.com/p/e70bac443cf2 3 runtime相关 能否向编译后的类中增加实例变量? 不能。 编译后,该类已经完成了实例变量的布局,不能再增加实例变量。 但可以向动态添加的类中增加实例变量。 6 Bl...

demondev 242

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

资深ios开发工程师收藏的iOS干货文章、大神的blog博客

以下网站不分排序。 1.1、喵神-OneV's Den 1.2、喵神-Swifter.tips 2、唐巧的技术博客 3、虾神的技术博客 4、Kitten的技术博客 5、CocoaPods建立私有仓库 6、iOS应用架构谈 view层的组织和调用方案 - 1、开篇 - 2、view层的组织和调用方案 - 3、网络层设计方案 - 4、动态部

2354

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

iOS进阶

作为开发者来说,或许各有千秋,有人希望认知面广,有人喜欢认知度深,各有千秋。不说好坏,前几天看了一篇帖子说是博客的目的就是引领开发者随着自己的逻辑重新认识某个知识点,我不否认这个观点,但是我只想表达自己的逻辑:我的博客,我自己做主,每个人写做的目的不一样,有的是为开发者解决bug有的只是记录自己的点点滴滴而已。         两个月的时间,看完了安卓,感觉万变不离其宗,语言语法特性,其实这些只

ZHZMAREN的博客 363

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【IOS】IOS开发问题解决方法索引(五)

1      Block教程系列 发布者:Seven's - 2013/04/22 - 分类:梦印象 ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发。 讨论范围:block的使用,内存管理,内部实现。 不包含的内容:gc arc下的block内存,block在c++中的使用。 Block介绍(一)基础 Block介绍(二)内存管理与其他特性 b

junbaozi的专栏 2602

升级版iOS开发面试题,难倒80%的iOS程序员?

序言: 之前一时兴致在本站上出过一份iOS的中级面试题,引起一些关注,不少同学表示对”隐藏关卡“感兴趣。升级版iOS面试题来了,目测难倒90%iOS程序员,目测一大波程序员撸着袖子在靠近。 每道题都不难,对知识广度有要求,请摸着良心回答,不要百度。 **声明:**这份面试题和iOS程序员本身技术水平没任何关联,无论你能否全部答出,都不要对自己产生任何正面或消极的评价,请理性对待,权当做闲暇之余的消遣。 作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:834688868,不

原来是泽镜的博客 286

IOS开发书籍推荐

今天准备开始了解并学习一下ios的开发,所以找了网上一篇文章感觉还不错,借用一下喽。鉴于swift还不是主流,还是从objective-c开始吧,心情还不错,哈哈 http://www.zhihu.com/question/19649679 我来说说我学习的过程:(无耻的使用一个回答 回答了很多问题。^^) 第一步,精读 Stephen G. Kochan 的《Obj

edmond999的专栏 8239

项目中的几个iOS效果看开发(项目用到,仅供本人理解)

1.判断tableview上拉,下拉效果 UIScrollView的contentOffset,UIScrollViewDelegate的两个方法,scrollviewWillScroll, scrollviewDidScroll. 在scrollviewWillScroll中记下scrollview的contentOffset的y,在scrollviewDidScroll中记下当前conte

zyy的专栏 1701

iOS动态插桩实战:基于Frida的Swizzler 2原理与应用

动态插桩技术通过在程序运行时注入代码,实现对应用行为的监控与修改,是软件逆向工程和安全分析的核心手段。其原理基于进程注入和函数Hook机制,能够在无需源码的情况下,实时拦截和修改目标函数调用。这项技术的核心价值在于提供无侵入式的运行时分析能力,广泛应用于安全审计、漏洞挖掘、协议分析和性能监控等场景。以iOS平台为例,Frida框架提供了跨平台的动态插桩能力,而Swizzler 2作为其上层工具集,通过模块化设计简化了Hook操作,特别针对网络流量监控和钥匙串访问等高频需求进行了优化,使开发者能够快速构建定制

weixin_33834628的博客 432
上一篇: Objective-C 基本类的Category (全而强大)
下一篇: coreData 深入理解3 (iOS5 以前线程安全与同步)
皓浩
博客等级 码龄18年 157粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值