美文网首页IOS知识积累
iOS 归档和解归档

iOS 归档和解归档

作者: 浅宇落 | 来源:发表于2019-08-01 16:42 被阅读12次

归档与解档是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(@"删除失败");
    }
    // 删除成功

相关文章

  • iOS 归档和解归档

    归档与解档是IOS中一种序列化与反序列化的方式。对象要实现序列化需要遵循NSCoding协议,而绝大多数Found...

  • iOS NSKeyedArchiver数据归档

    iOS中利用NSKeyedArchiver和NSKeyedUnarchiver进行数据的归档和解档操作。 归档 所...

  • 归档和解归档

    基本数据持久化:把OC中的基本数据存储到沙盒中。归档:把复杂类型转为data类型的过程。解归档:把data类型转为...

  • iOS. swift 本地数据归档和解档

    iOS. swift 本地数据归档和解档 userDataModel 文件 代码: class MyModel: ...

  • ios 归档和解归档(利用runtime)

    前言 iOS存取数据的方式有几种,这次项目中存储一些小数据所以用的归档,希望对用归档存储数据的同学有帮助。 iOS...

  • iOS数据持久化

    记录一下别人总结的,嘿嘿嘿【IOS学习基础】归档和解档

  • iOS 归档NSKeyedArchiver

    一、归档NSKeyedArchiver和解归档NSKeyedUnarchiver 1.首先确定存储路径。 NSHo...

  • iOS归档和解档

    OC的序列化和反序列化就是用来存储对象和访问对象。序列化就是通过归档把对象转化成二进制文件。反序列化就是通过解档把...

  • iOS归档和解档

    关键词: 归档:数据持久化的一种方式,是将数据进行编码序列化之后存储的过程。适用于小量数据的存储。 解档:对归档的...

  • iOS 归档和解档

    iOS的几种数据持久化方案 plist文件(属性列表) preference(偏好设置) NSKeyedArchi...

网友评论

    本文标题:iOS 归档和解归档

    本文链接:https://www.haomeiwen.com/subject/xhlcdctx.html