版本记录
版本号 | 时间 |
---|---|
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) 导航到项目的设置,然后选择要添加
MagicalRecord
的target
- 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
。
如果您使用的是CocoaPods
或MagicalRecord.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
时,您将定期处理两个主要对象:NSManagedObject
和NSManagedObjectContext
。
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];
注意:强烈建议使用具有并发类型
NSMainQueueConcurrencyType
的managed object context
在主线程上创建和设置默认上下文。
3. Performing Work on Background Threads - 在后台线程上执行工作
MagicalRecord
提供了设置和使用上下文以在后台线程中使用的方法。 后台保存操作受UIView动画block
方法的启发,但有一些细微差别:
- 您对实体
entities
进行更改的block
块将永远不会在主线程上执行。 - 在这些块中为您提供了单个
NSManagedObjectContext
。
例如,如果我们有Person
实体,并且我们需要设置firstName
和lastName
字段,那么您可以使用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框架之基本使用,感兴趣的给个赞或者关注~~~