原创blog,转载请注明出处
blog.csdn.net/hello_hwc
欢迎关注我的iOS SDK详解专栏,这里有很多基础的文章
http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html
前言:很多小的App只需要一个ManagedContext在主线程就可以了,但是有时候对于CoreData的操作要耗时很久的,比如App开启的时候要载入大量数据,如果都放在主线程,毫无疑问会阻塞UI造成用户体验很差。通常的方式是,主线程一个ManagedContext处理UI相关的,后台一个线程的ManagedContext负责耗时操作的,操作完成后通知主线程。使用CoreData的并行主要有两种方式
- Notificaiton
- child/parent context
何时会使用到后台-简单来说就是要耗费大量时间,如果在主线程上会影响用户体验的时候。例如
- 导入大量数据
- 执行大量计算
CoreData与线程安全
有一点要时刻记住
CoreData不是线程安全的,对于ManagedObject以及ManagedObjectContext的访问都只能在对应的线程上进行,而不能夸线程。
有几条自己总结的规则
- 对于多个线程,每个线程使用自己独立的ManagedContext
- 对于线程间需要传递ManagedObject的,传递
ManagedObject ID
,通过objectWithID
或者existingObjectWithID
来获取 - 对于持久化存储协调器(NSPersistentStoreCoordinator)来说,可以多个线程共享一个NSPersistentStoreCoordinator
ManagedObjectContext的类型
- NSConfinementConcurrencyType - context使用thread confinement 模式
- NSPrivateQueueConcurrencyType - context在私有线程上的
- NSMainQueueConcurrencyType - context在主线程上
并行的解决方案之Notification
简单来说,就是不同的线程使用不同的context进行操作,当一个线程的context发生变化后,利用notification来通知另一个线程Context,另一个线程调用
mergeChangesFromContextDidSaveNotification
来合并变化。
Notification的种类
NSManagedObjectContextObjectsDidChangeNotifica