CoreData并发操作模式简介

来源:互联网 发布:用java编写计算器程序 编辑:程序博客网 时间:2024/05/16 01:45
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并发操作 - 米安格 - 米安格的博客
0 0
原创粉丝点击