关于coredata的一些总结

作者: 无边小猪 | 来源:发表于2016-09-02 17:45 被阅读0次

CoreData的构成:
(1)NSManagedObjectContext 被管理者对象上下文,相当于一个未存储的临时数据库,我们存储或者查询都是通过这个对象来的。
(2)NSManagedObjectModel 被管理对象模型,可以简单的理解为可视化建模文件,可视化建模中是Entity自动生成model 方便让文件存储助理来进行管理。
(3)NSPersistentStoreCoordinator 文件存储助理,相当于数据库的链接器,它是CpreData的核心负责链接所有的模块,包括真实的存储文件。
(4)NSManagedObject 被管理的数据记录, 相当于数据库中的表格记录。
(5)NSFetchRequest 获取数据的请求,相当于SQL语句。
(6)NSEntityDescription 实体结构,相当于表结构。
(7)后缀为.xcdatamodeld的包 里面是.xcodemodel文件 用数据模型编辑器编译。编译后为.momd或.mom文件。

一些细节:
1、NSManagedObjectContext创建时apple推荐使用参数NSPrivateQueueConcurrencyType或NSMainQueueConcurrencyType,二者区别如下:

使用NSMainQueueConcurrencyType初始化时,block将会在主线程中执行


[_context performBlock:^(){
    
    [_context save:nil];
    
}];

使用NSPrivateQueueConcurrencyType初始化时,block将会在新子线程中执行,此中情况下涉及到更新UI的操作需要在主线程中调用,因此可以改进如下:

[_context performBlock:^(){
    
    [_context save:nil];
    
    dispatch_async(dispatch_get_main_queue(), ^{
        
        [_tableView reloadData];
        
        [self scrollToBottom];
        
    });
    
}];

2、MOC不是线程安全的,多个线程不能使用同一个,因此多线程使用MOC可以使用parent-child方法解决,每个子线程有一个MOC,主线程有一个MOC,主线程MOC是子线程MOC的parentContext。

例子如下:


 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(){
        NSManagedObjectContext *childcontext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
        childcontext.parentContext = _context;
        [childcontext performBlock:^(){
            Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:childcontext];
            person.name = [NSString stringWithFormat:@"json%i",count++];
            person.age = [NSNumber numberWithUnsignedInt:20];
            person.timestamp = [NSDate date];
            NSManagedObjectID *personid = person.objectID;
            [childcontext save:nil];
            [_context performBlock:^(){
                [_context save:nil];
                [_contextWrite performBlockAndWait:^(){
                    if ([_contextWrite hasChanges])
                    {
                        [_contextWrite save:nil];
                    }
                }];
                dispatch_async(dispatch_get_main_queue(), ^(){
                    [self.dataList addObject:[_contextWrite objectWithID:personid]];
                    [_tableView reloadData];
                    [self scrollToBottom];
                });
            }];
        }];
    });

以上parentcontext(main)<---childcontext(private)结构就可以解决大多数问题了,因为数据库的复杂操作往往来自于查询,尤其那些正则匹配、模糊查找,而将这些费时的操作放入childcontext中有多线程异步处理,可以不阻塞主线程。

上面的结构相当于将写入数据库的操作放在主线程中执行,因此对于大量写入数据库的情况是不适用的。而此时则可以使用三层结构解决:grandcontext(private)<---parentcontext(main)<---childcontext(private),其中childcontext负责数据处理查询,parentcontext用于同步操作、解决线程安全问题,grandcontext则用于写入操作。

3、多线程之间是不允许传递NSManagedObject的,但是可以通过传递NSManagedObjectID来解决。

相关文章

  • 关于coredata的一些总结

    CoreData的构成:(1)NSManagedObjectContext 被管理者对象上下文,相当于一个未存储的...

  • CoreData常用的查询

    总结下CoreData常用的一些查询 fetchLimit和fetchOffset分页查询、多字段排序: NSEx...

  • iOS中的存储方式中的CoreData(一)

    有很多关于CoreData的文章,本文简单的介绍在应用中集成和利用CoreData需要的组件以及CoreData的...

  • CoreData总结

    说明 本系列文章是参考《Core_Data_by_Tutorials_v2.0》这本书,由于是英文版的,个人的英语...

  • Swift3.0 CoreData数据存储三步曲

    我简单的研究下Swift的CoreData,感觉和Object-C差不多,CoreData并不可怕,我总结了下只需...

  • [swift]swift4.0 CoreData的使用

    CoreData基础在CoreData中有一些常用的类,称呼可能各不相同。NSPersistentStoreCoo...

  • CoreData之iOS10的改变

    ios10中的CoreData 在iOS中,CoreData有一些变化,主要是多了NSPersistentCont...

  • CoreData的冰山一角

    最近需要将项目的数据存储模式改为CoreData,所以来总结一下遇到的问题以及解决方法 在使用CoreData前,...

  • CoreData的使用

    之前看关于CoreData的使用都w是很早之前的,对于现在有些不太适用,在网上各种查找和总结之后,写了这篇文章,有...

  • 【优化篇】coreData数据迁移

    前面有有写过一篇关于coredata简单使用的教程【进阶篇】iOS coreData简单使用教程 说起coreda...

网友评论

    本文标题:关于coredata的一些总结

    本文链接:https://www.haomeiwen.com/subject/csqkettx.html