CoreData并发操作模式简介

iOS5.0中,苹果为CoreData的并发处理添加了两个内容。

一、首先介绍第一个内容:
CoreData框架中的NSManagedObjectContext类增加新的初始化方法:
initWithConcurrencyType:(NSManagedObjectContextConcurrencyType)ct;

1.参数方法介绍:
NSManagedObjectContextConcurrencyType一共有三种:
(1)NSPrivateQueueConcurrencyType:绑定一个后台线程。
(2)NSMainQueueConcurrencyType:绑定一个主线程
(3)NSConfinementConcurrencyType:此类型一般不用,这是为了兼容遗留旧代码用的。此类型不能执行performBlock。

2.ManagedObjectContext的performBlock和performBlockAndWait方法:

(1)performBlock方法:
在上下文队列中异步执行此block,塞入自动释放池,然后调用processPendingChanges方法。
- (void)performBlock:(void (^)())block;

(2)performBlockAndWait方法:
在上下文队列中同步执行此block,调用起来比较安全。
- (void)performBlockAndWait:(void (^)())block;

(3)processPendingChanges方法:
通常情况下上下文会在事件结束时同步改变到对象状态图。此方法会明确的触发此动作。
- (void)processPendingChanges; 

(4)save方法:
save保存到磁盘,调用save将自动调用processPendingChanges;

3.线程安全
(1)每一条线程只能有唯一的一个ManagedObjectContext的模式与此相对应,苹果的官方文档给出了两种解决并发问题的方案:
    <1>为每个线程创建单独的ManagedObjectContext,然后多个ManagedObjectContext共享一个独立的NSPersistentStoreCoordinator,这个是通常推荐使用的方式。
    <2>为每个线程创建单独的ManagedObjectContext和NSPersistentStoreCoordinator,这个方法在复杂、大并发的情况下使用,特别是需要在几个上下文中同步更改的场景,但是这个方法会增加内存使用量。
(2)NSManagedObjects不是线程安全的,但是NSManagedObjectIDs是线程安全的。
(3)如果在background保存,则需要通过core data Notification将changes同步到其他contexts。

二、嵌套的ManagedObjectContext

1.概述:
当子Context中做保存操作时,因为子context没有persistentStoreCoordinator,这个变化会首先推送给他的父context,这个操作将一直传递,直到找到没有父Context的RootContext为止,当rootContext收到这个消息的时候,rootContext自动合并了这次操作,并且做了最终的保存。所以子context查找时,同样也会首先从父context那里查找而不是直接与persistentStoreCoordinator交流。当使用这种结构时,不需要特别去监听NSManagedObjectContextObjectsDidChangeNotification 来合并异步操作到主线程,这也是这种结构的方便之处。

2.对于这种结构,有三种并发策略:

策略一:
这个策略可能并不是那么好,写在这里主要是为了与更好地备选方案进行对比。这个方案的组成部分:
(1)NSMainQueueConcurrencyType类型的Main Context,此上下文与persistentStoreCoordinator进行关联。
(2)NSPrivateQueueConcurrencyType类型的Background Context,Main Context作为它的上级Context。此Context用作数据插入和查询。

CoreData并发操作 - 米安格 - 米安格的博客   

策略二 :
此方案的组成部分:
(1)NSPrivateQueueConcurrencyType类型的Master Context,此上下文与persistentStoreCoordinator进行关联。
(2)NSMainQueueConcurrencyType类型的Main Context,作为Master Context的子Context。
(3)NSPrivateQueueConcurrencyType类型的Worker Context,此Context用作数据插入和查询。

同样使用嵌套ManagedObjectContext,但是使用PrivateQueue作为主Context。对于Worker Context作操作将会经由MainQueue Context 最终由MasterContext合并。这个方案的好处在于Worker Context都是临时工,不需要考虑他们的生命周期。另外的一个好处是,由于他们不能自动获取到来自父亲的更新,所以这个任务可以再未完成之前随时取消。

CoreData并发操作 - 米安格 - 米安格的博客

策略三 :
这个方案相对保守,没有使用嵌套Context这个新的特性。
此方案的组成部分:
(1)NSMainQueueConcurrencyType类型的Main Context,此上下文与persistentStoreCoordinator进行关联。
(2)NSPrivateQueueConcurrencyType类型的Background Context,此上下文也关联同一个persistentStoreCoordinator。

Main Context在主线程队列,Background Context在子线程队列。数据同步通过通知实现,每个Context都注册NSManagedObjectContextDidSaveNotification通知,并且在收到通知后调用另一个Context的mergeChangesFromContextDidSaveNotification方法。
CoreData并发操作 - 米安格 - 米安格的博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java图片的导出,并压缩

java图片的导出,并压缩 java 压缩包jar包使用的是commons-compress-1.6.jar /*** 导出图片* param request* param response*/RequestMapping("/exportPicture")public void exportPicture(HttpServletRequest request,HttpServletResponse response) throws Exce…

【Linux系统基础】(3)在Linux上部署运维监控Zabbix和Grafana

目录 运维监控Zabbix部署简介安装安装前准备 - Mysql安装Zabbix Server 和 Zabbix Agenta. 安装Zabbix yum库b. 安装Zabbix Server、前端、Agentc. 初始化Mysql数据库d. 为Zabbix Server配置数据库e. 配置Zabbix的PHP前端 配置zabbix 前端&#xff08;WEB UI&#xff09; 运维监…

Pods简介

每种语言发展到一个阶段&#xff0c;就会出现相应的依赖管理工具&#xff0c;例如 Java 语言的 Maven&#xff0c;nodejs 的 npm。随着 iOS 开发者的增多&#xff0c;业界也出现了为 iOS 程序提供依赖管理的工具&#xff0c;它的名字叫做&#xff1a;CocoaPods。 CocoaPods项目…

HashMap源码解释

HashMap 前言: 本文的hashMap是基于jdk1.7的hashMap. 关于jdk1.8的hashMap在另一篇中,那里将会介绍与1.7的差异与优势 首先基础知识介绍: 1.HashMap的成员变量   int DEFAULT_INITIAL_CAPACITY 16&#xff1a;默认的初始容量为2 ^ 4   int MAXIMUM_CAPACITY 1 <<…

MagicRecord For IOS 简介

一、概述 MagicalRecord 灵感来自于简洁的Ruby语言中 Rails Active Record 查询方式. MagicalRecord 这个开源库的核心思想是: 1.清除 Core Data 相关的代码2.简洁的清除,简单的一行搜索记录的功能3.当然允许使用NSFetchRequest,当存在着复杂的搜索条件时 二、使用 1. 导入框架…

对象引用 String引用 基本类型引用 差别

最近遇到一个线上问题,原因是忽略的引用的一些语法,导致出错,现在记录一下: Testpublic void testList(){List<String> list new ArrayList<String>();list.add("1");list.add("2");list.add("3");List<String> list2 new …

Mantle For iOS

Mantle可以很方便的去书写一个模型层的代码。 使用它可以很方便的去反序列化JSON或者序列化为JSON(需要在MTLModel子类中实现<MTLJSONSerializing>协议) 使用一个解释器MTLJSONAdapter去转换模型对象。 NSError *error nil; MyObject *myObject [MTLJSONAdapter modelO…

String的split方法的使用

1.引言 split方法很常用,记得我入职公司的时候,第一道笔试题就是关于字符串的拆分拼装等,这也足以说明,大公司对这些方法的重视程度. 其实我们平时一般用到的都是这些方法最简单的用法,但如果你不了解他的实现原理,碰到某些特殊问题终究是会被卡住的,于是就产生了所谓的bug,而…

ReactiveCocoa入门

概述 为什么要使用RAC&#xff1f;一个怪怪的东西&#xff0c;从Demo看也没有让代码变得更好、更短&#xff0c;相反还造成理解上的困难&#xff0c;真的有必要去学它么&#xff1f;相信这是大多数人在接触RAC时的想法。RAC不是单一功能的模块&#xff0c;它是一个Framework&am…

[前台]---input标签中的hidden,浏览器差异问题

前言: 这是一个比较简单的问题,也有人犯过这样的错误,如果你是一个人在编码,并且没有专门的去测试浏览器差异,这个或许会坑到你 问题描述: 用input标签的时候,需要把这个input隐藏掉,于是先这样做: <input hidden id"xxx" value"xxx"/> 这行代码…

C++和Objective-C混编(官方文档翻译)

苹果的Objective-C编译器允许用户在同一个源文件里自由地混合使用C和Objective-C&#xff0c;混编后的语言叫Objective-C。有了它&#xff0c;你就可以在Objective-C应用程序中使用已有的C类库。 Build Setting中要设定编译文件类型设置&#xff0c;如下图&#xff1a;Objectiv…

SpringMVC获取response的问题

SpringMVC获取response的问题: 关于用以下这种方式获取response的一些问题: ((ServletWebRequest) RequestContextHolder.getRequestAttributes()).getResponse(); 网上对于这种方式获取response的描述很多,我用的是jar包版本是3.2.9.release web.xml中肯定也是加了Request…

BigDecimal的个人总结

前言: 互联网公司,对于BigDecimal的使用,还是较为频繁的,那么就会涉及到关于这个类型的种种问题. 1:为什么使用BigDecimal 首先java八大基本类型真的很基本,4个整型搞不了小数,double和float搞的了小数,但搞不好,关键时刻就调链子,当然这也和他们存储方式有关(二进制无法精确的…

MagicRecord For IOS API深层解析

一、NSManagedObjectContext创建和获取1.默认上下文(每种只存在一个)&#xff08;1&#xff09;MR_rootSavingContext&#xff1a;此方法返回的上下文类型为NSPrivateQueueConcurrencyType(后台线程)&#xff0c;直接关联持久化协调器&#xff0c;对此上下文对象执行保存方法&a…

BeanUtils.copyProperties(对象A,对象B)

对于两个实例的复制,如果属性名字相同,则可以通过这个方法来操作,但是在使用的时候,一定要注意BeanUtils用的是哪个包的,因为常用的两个包,都有这个类和对应的方法,而复制方向却相反,所以一定要注意自动导包时选择的包!!!!!! 1.import org.springframework.beans.BeanUtils 这…

Xcode中的-ObjC和-all_load

有时候使用第三方库的时候&#xff0c;需要在Xcode的Build Settings下Other Linker Flags里面加入-ObjC标志。 之所以使用该标志&#xff0c;和Objective-C的一个重要特性&#xff1a;类别&#xff08;category)有关。根据这里的解释&#xff0c;Unix的标准静态库实现和Object…

[前台]---ajax返回200成功,却进入error函数的解决方法

最近碰到一个问题,就是如题目所说,ajax在调用的时候,明明返回成功了,但js代码却走到了error中,最后发现是我返回的json格式不对,jQuery在1.4后,对ajax返回的json格式有了很强的限制,所以一定要用严格的JSON格式返回. 先上代码: jQuery.ajax({type: "POST",async: tr…

SpringMVC解决静态资源不能访问

解决: 直接在SpringMVC的xml文件中加一行配置: <mvc:default-servlet-handler/> 问题根源: 做项目迁移的时候,原来控制层的框架是Struts2,现在要换成SpringMVC,第一版是尽量少改动的移过去,保证功能都正常,第二版开始优化,于是: 原来项目的访问都是XXX.action,现在想…

CocoaPods版本升级

和往常一样使用CocoaPods管理一个基于FMDB的项目类库 命令行执行 $ pod install [!] The master repo requires CocoaPods 0.32.1 - 失败&#xff0c;提示需要CocoaPods 0.32.1版本 查看CocoaPods版本 $ pod --version 0.29.0 确实需要更新了 命令行更新&#xff08;安装&…

[前台]---js获取input标签中name相同的各个value值

在页面form表单中,经常会有相同name的多个input标签,在提交表单前需要对这些input的value值做校验,就要在js中拿到这些值,下面这个方法,亲测是最实在的: 页面:<input type"hidden" name"myname" value"aa"/><input type"hidden&qu…