CoreData+多线程

基础知识:Core Data入门

查询语句:[IOS开发]CoreData条件查询之NSPredicate应用_超人_新浪博客


NSManagedObject

NSManagedObject的子类只是用于CoreData内部,它不能用于我们说的model。

我们是把数据model传给NSManagedObject的子类,然后用context把这个NSManagedObject的子类保存在数据库中。


在已建立的CoreData数据库中,取不出数据:

原因是:创建的context的ConcurrencyType为NSPrivateQueueConcurrencyType

NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

因为,如果第一次创建的上下文context设置为private类型的话,第二次就获取不到这个上下文了,如果获取不到这个上下文,自然就取不出来以前的数据库的内容了。所以应该:

NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];


CoreData中的NSManagedObjectContext在多线程中不安全,如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext,每个NSManagedObjectContext对象实例都可以使用同一个NSPersistentStoreCoordinator实例,这个实例可以很安全的顺序访�问永久存储,这是因为NSManagedObjectContext会在便用NSPersistentStoreCoordinator前上锁。

NSManagedObjectContext提供了initWithConcurrentcyType方法,其中的一个NSPrivateQueueConcurrencyType,会自动的创建一个新线程来存放NSManagedObjectContext而且它还会自动创建NSPersistentStoreCoordinator。

在实际的开发当中,我遇到了各种各样的问题,如果是多线程操作数据库的话,个人建议:

1: 最好一个线程对应一个NSManagedObjectContext。如果只有一个NSManagedObjectContext,并且多个线程对其进行操作,回出现许多不清不楚的问题。

2:在每一个线程对应一个NSManagedObjectContext的时候,尽量一个线程只读写与其对应的context。在其完成操作的时候通知另外的线程去修改其对应的context。在apple的api中有NSManagedObjectContextDidSaveNotification, 它可以帮助你通知修改其它的contexts。

上面的代码只是简单利用NSManagedObjectContextDidSaveNotification,当子线程修改了数据库以后,通知主线程去修改其对应的context。当然childThreadManagedObjectContext的创建是在创建子线程的时候进行的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容