Core Data详细解析(十) —— MagicalRecord框架之基本使用(一)

版本记录

版本号 时间
V1.0 2018.09.29 星期六

前言

数据是移动端的重点关注对象,其中有一条就是数据存储。CoreData是苹果出的数据存储和持久化技术,面向对象进行数据相关存储。感兴趣的可以看下面几篇文章。
1. iOS CoreData(一)
2. iOS CoreData实现数据存储(二)
3. Core Data详细解析(三) —— 一个简单的入门示例(一)
4. Core Data详细解析(四) —— 一个简单的入门示例(二)
5. Core Data详细解析(五) —— 基于多上下文的Core Data简单解析示例(一)
6. Core Data详细解析(六) —— 基于多上下文的Core Data简单解析示例(二)
7. Core Data详细解析(七) —— Core Data的轻量级迁移(一)
8. Core Data详细解析(八) —— Core Data的轻量级迁移(二)
9. Core Data详细解析(九) —— MagicalRecord框架之基本概览(一)

Installing - 安装

MagicalRecord添加到您的项目很简单:只需选择您最熟悉的方法,然后按照以下说明操作即可。

1. Using Carthage - 使用Carthage

  • Cartfile中添加下面命令行
github "MagicalPanda/MagicalRecord"
  • 在文件工程目录运行carthage update

  • 将适用于您的平台的MagicalRecord.framework(位于“Carthage / Build /``”)拖到应用程序的Xcode项目中,并将其添加到适当的目标中。

2. Using CocoaPods - 使用CocoaPods

在项目中集成MagicalRecord的最简单方法之一是使用CocoaPods

  • 将以下行添加到Podfile:

1) Plain

pod "MagicalRecord"

2) 使用CocoaLumberjack作为Logger

pod“MagicalRecord / CocoaLumberjack”
  • 在项目目录中,运行pod update

  • 您现在应该可以将#import <MagicalRecord / MagicalRecord.h>添加到任何目标的源文件中并开始使用MagicalRecord

3. Using an Xcode subproject - 使用Xcode子工程

Xcode子项目允许您的项目使用和构建MagicalRecord作为隐式依赖项。

  • 1) 将MagicalRecord作为Git子模块添加到项目中:
$ cd MyXcodeProjectFolder
$ git submodule add https://github.com/magicalpanda/MagicalRecord.git Vendor/MagicalRecord
$ git commit -m "Add MagicalRecord submodule"
  • 2) 拖动Vendor/MagicalRecord/MagicalRecord.xcproj到你的Xcode工程里。
  • 3) 导航到项目的设置,然后选择要添加MagicalRecordtarget
  • 4) 导航到Build Phases并展开Link Binary With Libraries部分
  • 5) 单击+并找到适合您目标平台的MagicalRecord框架版本
  • 6) 您现在应该可以将#import <MagicalRecord / MagicalRecord.h>添加到任何目标的源文件中并开始使用MagicalRecord

请注意,如果您已将Xcode的Link Frameworks Automatically设置为No,那么您可能需要将CoreData.framework添加到iOS上的项目中,因为UIKit默认情况下不包含Core Data。在OS X上,Cocoa包含Core Data


Shorthand Category Methods - 简便分类方法

默认情况下,MagicalRecord提供的所有类别方法都以MR_为前缀。 这符合 Apple's recommendation not to create unadorned category methods to avoid naming clashes

如果您愿意,可以包含以下标题以使用更短的非前缀类别方法:

#import <MagicalRecord/MagicalRecord.h>
#import <MagicalRecord/MagicalRecord+ShorthandMethods.h>
#import <MagicalRecord/MagicalRecordShorthandMethodAliases.h>

如果您使用的是Swift,则需要将这些imports添加到目标的Objective-C bridging header中。

一旦你包含了headers,你应该在设置/使用MagicalRecord之前调用+ [MagicalRecord enableShorthandMethods]类方法:

- (void)theMethodWhereYouSetupMagicalRecord
{
    [MagicalRecord enableShorthandMethods];

    // Setup MagicalRecord as per usual
}

请注意,我们不提供此功能的支持。 如果它不起作用,please file an issue,我们会尽可能地解决它。


Getting - Started - 开始使用

首先,在项目的pch文件中导入MagicalRecord.h头文件。 这将允许全局包含所有必需的header

如果您使用的是CocoaPodsMagicalRecord.framework,则导入应如下所示:

// Objective-C
#import <MagicalRecord/MagicalRecord.h>
// Swift
import MagicalRecord

否则,如果您已将MagicalRecord的源文件直接添加到Objective-C项目,则导入应为:

#import "MagicalRecord.h"

接下来,在app delegate中的某个位置,在 - applicationDidFinishLaunching:withOptions:方法或-awakeFromNib中,使用以下一个使用MagicalRecord类的安装调用:

+ (void)setupCoreDataStack;
+ (void)setupAutoMigratingCoreDataStack;
+ (void)setupCoreDataStackWithInMemoryStore;
+ (void)setupCoreDataStackWithStoreNamed:(NSString *)storeName;
+ (void)setupCoreDataStackWithAutoMigratingSqliteStoreNamed:(NSString *)storeName;
+ (void)setupCoreDataStackWithStoreAtURL:(NSURL *)storeURL;
+ (void)setupCoreDataStackWithAutoMigratingSqliteStoreAtURL:(NSURL *)storeURL;

每次调用都会实例化每个Core Data堆栈中的一个,并为这些实例提供getter和setter方法。 这些就是众所周知的MagicalRecord实例,被认为是“默认值”。

使用设置了DEBUG标志的默认SQLite数据存储时,在不创建新模型版本的情况下更改模型将导致MagicalRecord删除旧存储并自动创建新存储。 这可以节省大量时间 - 每次更改数据模型时都不需要卸载并重新安装应用程序! 请确保不要在启用DEBUG的情况下发送您的应用:删除应用的数据而不告诉用户它是非常糟糕的形式!

在您的应用退出之前,您应该调用+ cleanUp类方法:

[MagicalRecord cleanUp];

这在MagicalRecord之后整理,拆除我们的自定义错误处理并将MagicalRecord创建的所有Core Data堆栈设置为nil

1. iCloud-enabled Persistent Stores - 支持iCloud的持久存储

要利用Apple的iCloud Core Data同步,请使用以下设置方法之一代替上一节中列出的标准方法:

+ (void)setupCoreDataStackWithiCloudContainer:(NSString *)containerID
                              localStoreNamed:(NSString *)localStore;

+ (void)setupCoreDataStackWithiCloudContainer:(NSString *)containerID
                               contentNameKey:(NSString *)contentNameKey
                              localStoreNamed:(NSString *)localStoreName
                      cloudStorePathComponent:(NSString *)pathSubcomponent;

+ (void)setupCoreDataStackWithiCloudContainer:(NSString *)containerID
                               contentNameKey:(NSString *)contentNameKey
                              localStoreNamed:(NSString *)localStoreName
                      cloudStorePathComponent:(NSString *)pathSubcomponent
                                   completion:(void (^)(void))completion;

+ (void)setupCoreDataStackWithiCloudContainer:(NSString *)containerID
                              localStoreAtURL:(NSURL *)storeURL;

+ (void)setupCoreDataStackWithiCloudContainer:(NSString *)containerID
                               contentNameKey:(NSString *)contentNameKey
                              localStoreAtURL:(NSURL *)storeURL
                      cloudStorePathComponent:(NSString *)pathSubcomponent;

+ (void)setupCoreDataStackWithiCloudContainer:(NSString *)containerID
                               contentNameKey:(NSString *)contentNameKey
                              localStoreAtURL:(NSURL *)storeURL
                      cloudStorePathComponent:(NSString *)pathSubcomponent
                                   completion:(void (^)(void))completion;

有关详细信息,请参阅Apple's "iCloud Programming Guide for Core Data"

2. Notes - 注意

如果您正在管理多个启用iCloud的存储,我们建议您使用一种较长的安装方法,以允许您指定自己的contentNameKey。 较短的设置方法会根据您应用的包标识符(CFBundleIdentifier)自动生成NSPersistentStoreUbiquitousContentNameKey


Working with Managed Object Contexts - 使用Managed Object Contexts

1. Creating New Contexts - 创建新的上下文

提供了各种简单的类方法来帮助您创建新的上下文:

  • + [NSManagedObjectContext MR_newContext]:将默认上下文设置为父上下文。 具有NSPrivateQueueConcurrencyType的并发类型。
  • + [NSManagedObjectContext MR_newMainQueueContext]:具有NSMainQueueConcurrencyType的并发类型。
  • + [NSManagedObjectContext MR_newPrivateQueueContext]:具有NSPrivateQueueConcurrencyType的并发类型。
  • + [NSManagedObjectContext MR_newContextWithParent:...]:允许您指定将要设置的父上下文。 具有NSPrivateQueueConcurrencyType的并发类型。
  • + [NSManagedObjectContext MR_newContextWithStoreCoordinator:...]:允许您为新上下文指定持久性存储协调器。 具有NSPrivateQueueConcurrencyType的并发类型。

2. The Default Context - 默认上下文

使用Core Data时,您将定期处理两个主要对象:NSManagedObjectNSManagedObjectContext

MagicalRecord提供了一个简单的类方法来检索可在整个应用程序中使用的默认NSManagedObjectContext。此上下文在主线程上运行,非常适合简单的单线程应用程序。

要访问默认上下文,请致电:

NSManagedObjectContext * defaultContext = [NSManagedObjectContext MR_defaultContext];

在使用上下文的任何方法中,此上下文将在整个MagicalRecord中使用,但不会提供特定的managed object context参数。

如果需要创建新的managed object context以在非主线程中使用,请使用以下方法:

NSManagedObjectContext * myNewContext = [NSManagedObjectContext MR_newContext];

这将创建一个新的managed object context,它具有与默认上下文相同的对象模型和持久性存储,但在另一个线程上使用是安全的。它会自动将默认上下文设置为父上下文。

如果您想使myNewContext实例成为所有获取请求的默认值,请使用以下类方法:

[NSManagedObjectContext MR_setDefaultContext:myNewContext];

注意:强烈建议使用具有并发类型NSMainQueueConcurrencyTypemanaged object context在主线程上创建和设置默认上下文。

3. Performing Work on Background Threads - 在后台线程上执行工作

MagicalRecord提供了设置和使用上下文以在后台线程中使用的方法。 后台保存操作受UIView动画block方法的启发,但有一些细微差别:

  • 您对实体entities进行更改的block块将永远不会在主线程上执行。
  • 在这些块中为您提供了单个NSManagedObjectContext

例如,如果我们有Person实体,并且我们需要设置firstNamelastName字段,那么您可以使用MagicalRecord设置背景上下文供您使用:

Person *person = ...;

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext){

  Person *localPerson = [person MR_inContext:localContext];
  localPerson.firstName = @"John";
  localPerson.lastName = @"Appleseed";

}];

在此方法中,指定的block块为您提供了执行操作的正确上下文,您无需担心设置上下文以便它告诉默认上下文它已完成,并且应该更新因为执行了更改在另一个线程上。

要在此保存block块完成后执行操作,您可以填写completion块:

Person *person = ...;

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext){

  Person *localPerson = [person MR_inContext:localContext];
  localPerson.firstName = @"John";
  localPerson.lastName = @"Appleseed";

} completion:^(BOOL success, NSError *error) {

  self.everyoneInTheDepartment = [Person findAll];

}];

在主线程(队列)上调用此completion块,因此这对于触发UI更新也是安全的。


Creating Entities - 创建实体

要在默认上下文中创建和插入实体的新实体(Entity),您可以使用:

Person *myPerson = [Person MR_createEntity];

要创建实体并将其插入特定上下文:

Person *myPerson = [Person MR_createEntityInContext:otherContext];

后记

本篇主要讲述了MagicalRecord框架之基本使用,感兴趣的给个赞或者关注~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容