项目作者: CandyGentleman

项目描述 :
自己封装的一套基于苹果coreData的网络框架,很好用!
高级语言: Objective-C
项目地址: git://github.com/CandyGentleman/coreData.git
创建时间: 2016-01-17T15:08:32Z
项目社区:https://github.com/CandyGentleman/coreData

开源协议:

下载


iOS coredata Stack 工具类封装技巧

提问与回答

苹果系统生成的模板中已经把 Core Data 的基础准备都放在 AppDelegate 中了,为什么还要自己封装?

  • 因为:基础准备代码比较繁琐,不容易记忆, 基础准备一经设置,也无法修改,为了提高灵活运用,还是自己封装一下比较好!

基础知识了解

  • Core Data 的核心对象都不是线程安全的,封装此框架之前,需要先了解一下的类:

    • NSManagedObjectContext 管理对象上下文
    • NSManagedObjectModel 管理对象模型
    • NSPersistentStoreCoordinator 持久化存储调度器
    • 思维导图,苹果官方给出的coreData的存储示意图如下:

操作步骤

新建 coreData工具类
建立单例对象
  • 单例的实现


    1. +(instancetype)shareManager{

    2. static dispatch_once_t onceToken;
      dispatch_once(&onceToken, ^{

    3.  instance = [[self alloc] init];
    4. });
      return instance;
      }

+(instancetype)allocWithZone:(struct _NSZone *)zone{

  1. static dispatch_once_t onceToken;
  2. dispatch_once(&onceToken, ^{
  3. instance = [super allocWithZone:zone];
  4. });
  5. return instance;

}

// 重写init方法

  • (instancetype)init
    {
    self = [super init];
    if (self) {

    1. [self managedObjectContext];

    }
    return self;
    }

  • 单例方法中什么时候需要实现 allocWithZone: 方法?

    • 如果单例对象提供的方法,允许用户进行私人定制,则无需实现 allocWithZone:,例如:NSURLSession
    • 如果单例对象中提供的操作涉及到线程安全,并且确定没有定制需求,则应该实现 allocWithZone: 方法

Core Data Stack 相关方法

  • 新建 Model.xcdatamodeld,注意文件名可以随便写,并且建立 Person 实体
  • 从 AppDelegate 复制 managedObjectContext
  1. // 创建一个只读上下文本属性
  2. @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
* 利用 @synthesize 指定成员变量
  1. @synthesize managedObjectContext = _managedObjectContext;
  2.  
  • 将 persistentStoreCoordinator 和 managedObjectModel 中的关键代码顺序复制到 managedObjectContext 的 getter 方法中
  1. - (NSManagedObjectContext *)managedObjectContext {
  2.  
  3. // 返回已经绑定到`持久化存储调度器`的管理对象上下文
  4. if (_managedObjectContext != nil) {
  5. return _managedObjectContext;
  6. }
  7.  
  8. // 数据模型的 URL
  9. NSURL *modelURL = [[NSBundle mainBundle] URLForResource:modelName withExtension:@"momd"];
  10. // 从 Bundle 加载对象模型
  11. NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
  12.  
  13. // 创建持久化存储调度器
  14. NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
  15. // 指定保存在磁盘的数据库文件 URL
  16. NSURL *applicationURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
  17. NSURL *storeURL = [applicationURL URLByAppendingPathComponent:dbName];
  18.  
  19. if ([psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:NULL] == nil) {
  20. NSLog(@"创建数据库错误");
  21. return nil;
  22. }
  23. // 创建管理对象上下文,并且指定并发类型
  24. _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
  25. // 设置管理上下文的存储调度器
  26. [_managedObjectContext setPersistentStoreCoordinator:psc];
  27.  
  28. return _managedObjectContext;
  29. }

思维导图如下:

  • 复制并修改 saveContext 方法
    1.  
  • (BOOL)saveContext{

    // 判断上下文是否为 nil
    if (self.managedObjectContext == nil) {

    1. NSLog(@"上下文为nil,无法进行数据操作");
    2. return NO;

    }
    NSError *error = nil;
    if (self.managedObjectContext.hasChanges && ![self.managedObjectContext save:&error]) {

    1. NSLog(@"没有需要保存的数据");
    2. return NO;

    }
    [self.backgroundMoc save:NULL];
    return YES;
    }