归档与解档是IOS中一种序列化与反序列化的方式。对象要实现序列化需要遵循NSCoding协议,而绝大多数Foundation和Cocoa Touch类都遵循了NSCoding协议。下面看看具体的实现方式.
要归档的对象类
.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface jokesModel : NSObject<NSSecureCoding>
/** 类别 */
@property (nonatomic, copy) NSString *cate;
/** 内容 */
@property (nonatomic, copy) NSString *text;
/** 发布时间 */
@property (nonatomic, copy) NSString *passtime;
/** 评论数 */
@property (nonatomic, assign) NSInteger comment;
@end
NS_ASSUME_NONNULL_END
.m
#import "jokesModel.h"
#import "MJExtension.h"
@implementation jokesModel
//对象的归档和反归档
MJExtensionCodingImplementation
+ (BOOL)supportsSecureCoding {
return YES;
}
@end
归档和解归档工具类
.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface ArchiveTool : NSObject
/**
对象归档
@param object 要归档的对象
@return YES: 归档成功 NO: 归档失败
*/
+ (BOOL)archiveObject:(id)object;
/**
对象解归档
@param class 要解归档的类
@return 解归档对象
*/
+ (id)unarchiveClass:(Class)class;
/**
删除归档
@param class 要删除归档的类
@return YES: 删除成功 NO: 删除失败
*/
+ (BOOL)deleteArchiveClass:(Class)class;
@end
.m
#import "ArchiveTool.h"
#define kArchive @"archive" // 文件夹名称
@implementation ArchiveTool
#pragma mark - 对象归档
+ (BOOL)archiveObject:(id)object {
if (!object) { // 没有值
return NO;
}
NSError *error;
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:object requiringSecureCoding:YES error:&error];
if (error) {
return NO;
}
NSString *prefix = NSStringFromClass([object class]);
return [data writeToFile:[self getPathWithPrefix:prefix] atomically:YES];
}
#pragma mark - 对象解归档
+ (id)unarchiveClass:(Class)class {
NSString *prefix = NSStringFromClass(class);
if (prefix.length <= 0) { // 没有值
return nil;
}
NSError *error;
NSData *data = [[NSData alloc] initWithContentsOfFile:[self getPathWithPrefix:prefix]];
id content = [NSKeyedUnarchiver unarchivedObjectOfClass:class fromData:data error:&error];
if (error) {
return nil;
}
return content;
}
#pragma mark - 删除归档
+ (BOOL)deleteArchiveClass:(Class)class {
NSString *caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
NSString *filePathFolder = [caches stringsByAppendingPaths:@[kArchive]].firstObject;
if (![[NSFileManager defaultManager] fileExistsAtPath:filePathFolder]) {
return YES;
}
NSError *error;
NSString *prefix = NSStringFromClass(class);
NSString *path = [NSString stringWithFormat:@"%@/%@.archive",filePathFolder,prefix];
return [[NSFileManager defaultManager] removeItemAtPath:path error:&error];
}
/**
存放的文件路径
*/
+ (NSString *)getPathWithPrefix:(NSString *)prefix {
NSString *caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
NSString *filePathFolder = [caches stringsByAppendingPaths:@[kArchive]].firstObject;
if (![[NSFileManager defaultManager] fileExistsAtPath:filePathFolder]) {
[[NSFileManager defaultManager] createDirectoryAtPath:filePathFolder withIntermediateDirectories:YES attributes:nil error:nil];
}
NSString *path = [NSString stringWithFormat:@"%@/%@.archive",filePathFolder,prefix];
return path;
}
使用
jokesModel *model = [[jokesModel alloc] init];
model.cate = @"书籍";
model.text = @"官场";
model.passtime = @"2019-07-23 12:33:22";
model.comment = 10;
// 对象归档
[ArchiveTool archiveObject:model];
// 对象解归档
jokesModel *unarchiveModel = [ArchiveTool unarchiveClass:[jokesModel class]];
NSLog(@"unarchiveModel: %@ %@ %@ %ld", unarchiveModel.cate, unarchiveModel.text, unarchiveModel.passtime, unarchiveModel.comment);
// unarchiveModel: 书籍 官场 2019-07-23 12:33:22 10
// 更新模型
unarchiveModel.cate = @"武功";
unarchiveModel.text = @"降龙十八掌";
[ArchiveTool archiveObject:unarchiveModel];
jokesModel *unModel = [ArchiveTool unarchiveClass:[jokesModel class]];
NSLog(@"unModel: %@ %@ %@ %ld", unModel.cate, unModel.text, unModel.passtime, unModel.comment);
// unModel: 武功 降龙十八掌 2019-07-23 12:33:22 10
// 删除归档
if ([ArchiveTool deleteArchiveClass:[TempModel class]]) {
NSLog(@"删除成功");
}else {
NSLog(@"删除失败");
}
// 删除成功
网友评论