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

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

请注意,如果您已将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 
#import 
#import 

如果您使用的是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 
// 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框架之基本使用,感兴趣的给个赞或者关注~~~

Core Data详细解析(十) —— MagicalRecord框架之基本使用(一)_第1张图片

你可能感兴趣的:(Core Data详细解析(十) —— MagicalRecord框架之基本使用(一))