IOS知识积累

iOS 归档和解归档

2019-08-01  本文已影响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(@"删除失败");
    }
    // 删除成功
上一篇 下一篇

猜你喜欢

热点阅读