牛骨文教育服务平台(让学习变的简单)
博文笔记

CoreData并发操作模式简介

创建时间:2017-02-10 投稿人: 浏览次数:404
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并发操作 - 米安格 - 米安格的博客
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。