CoreData的线程安全

1.没有线程安全的coredata数据读取:
NSManagedObjectContext对象的创建:
_managedObjectContext = [[NSManagedObjectContext alloc] init];

2.线程安全的coreData操作:
1,创建并行的NSManagedObjectContext对象:
[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

ps:
NSConfinementConcurrencyType (或者不加参数,默认就是这个)
NSMainQueueConcurrencyType (表示只会在主线程中执行)
NSPrivateQueueConcurrencyType (表示可以在子线程中执行)

在主线程,主要执行插入,修改和删除操作,一些小的查询也可以在这里同步执行,如果有大的查询,就起一个新的 NSPrivateQueueConcurrencyType 类型的 NSManagedObjectContext,然后放在后台去执行查询,查询完成后将结果返回主线程。

如果是查询的话,因为 NSManagedObject 也不能跨线程访问,所以在block里获取到的NSManagedObject对象只能将objectid传到主线程,主线程再通过 objectWithID 恢复对象的方法

2,NSManagedObjectContext在后台线程执行是通过 performBlock 方法来实现的,在执行读取操作时使用一下两个方法:

-(void)performBlock:(void (^)(void))block
-(void)performBlockAndWait:(void (^)(void))block

注意:
如果两个线程同时访问一份context,尤其是其中一个进行写操作,另一个进行读操作,就很容易发生死锁,所以这些动作需要保证有序地得到执行。

你可能感兴趣的:(CoreData的线程安全)