美文网首页
runtime自动解档归档

runtime自动解档归档

作者: 堕落白天使 | 来源:发表于2018-11-19 11:54 被阅读0次

如果你实现过自定义模型数据持久化的过程,那么你也肯定明白,如果一个模型有许多个属性,那么我们需要对每个属性都实现一遍encodeObject 和decodeObjectForKey方法,如果这样的模型又有很多个,这还真的是一个十分麻烦的事情。下面来看看简单的实现方式。

假设现在有一个Movie类,有3个属性,它的h文件这这样的

#import <Foundation/Foundation.h>

//1. 如果想要当前类可以实现归档与反归档,需要遵守一个协议NSCoding

@interface Movie : NSObject<NSCoding>

@property (nonatomic, copy) NSString *movieId;

@property (nonatomic, copy) NSString *movieName;

@property (nonatomic, copy) NSString *pic_url;

@end

如果是正常写法, m文件应该是这样的:

#import "Movie.h"

@implementation Movie

- (void)encodeWithCoder:(NSCoder *)aCoder

{

    [aCoder encodeObject:_movieId forKey:@"id"];

    [aCoder encodeObject:_movieName forKey:@"name"];

    [aCoder encodeObject:_pic_url forKey:@"url"];

}

- (id)initWithCoder:(NSCoder *)aDecoder

{

    if (self = [super init]) {

        self.movieId = [aDecoder decodeObjectForKey:@"id"];

        self.movieName = [aDecoder decodeObjectForKey:@"name"];

        self.pic_url = [aDecoder decodeObjectForKey:@"url"];

    }

    return self;

}

@end

如果这里有100个属性,那么我们也只能把100个属性都给写一遍。

不过你会使用runtime后,这里就有更简便的方法。

下面看看runtime的实现方式:

#import "Movie.h"

#import <objc/runtime.h>

@implementation Movie

- (void)encodeWithCoder:(NSCoder *)encoder

{

    unsigned int count = 0;

    Ivar *ivars = class_copyIvarList([Movie class], &count);

    for (int i = 0; i<count; i++) {

        // 取出i位置对应的成员变量

        Ivar ivar = ivars[i];

        // 查看成员变量

        const char *name = ivar_getName(ivar);

        // 归档

        NSString *key = [NSString stringWithUTF8String:name];

        id value = [self valueForKey:key];

        [encoder encodeObject:value forKey:key];

    }

    free(ivars);

}

- (id)initWithCoder:(NSCoder *)decoder

{

    if (self = [super init]) {

        unsigned int count = 0;

        Ivar *ivars = class_copyIvarList([Movie class], &count);

        for (int i = 0; i<count; i++) {

        // 取出i位置对应的成员变量

        Ivar ivar = ivars[i];

        // 查看成员变量

        const char *name = ivar_getName(ivar);

      // 归档

      NSString *key = [NSString stringWithUTF8String:name];

      id value = [decoder decodeObjectForKey:key];

      // 设置到成员变量身上

        [self setValue:value forKey:key];

        }

        free(ivars);

    }

    return self;

}

@end

这样的方式实现,不管有多少个属性,写这几行代码就搞定了。怎么,还嫌麻烦,下面看看更加简便的方法:两句代码搞定。

我们把encodeWithCoder 和 initWithCoder这两个方法抽成宏

#import "Movie.h"

#import <objc/runtime.h>

#define encodeRuntime(A) \

\

unsigned int count = 0;\

Ivar *ivars = class_copyIvarList([A class], &count);\

for (int i = 0; i<count; i++) {\

Ivar ivar = ivars[i];\

const char *name = ivar_getName(ivar);\

NSString *key = [NSString stringWithUTF8String:name];\

id value = [self valueForKey:key];\

[encoder encodeObject:value forKey:key];\

}\

free(ivars);\

\

#define initCoderRuntime(A) \

\

if (self = [super init]) {\

unsigned int count = 0;\

Ivar *ivars = class_copyIvarList([A class], &count);\

for (int i = 0; i<count; i++) {\

Ivar ivar = ivars[i];\

const char *name = ivar_getName(ivar);\

NSString *key = [NSString stringWithUTF8String:name];\

id value = [decoder decodeObjectForKey:key];\

[self setValue:value forKey:key];\

}\

free(ivars);\

}\

return self;\

\

@implementation Movie

- (void)encodeWithCoder:(NSCoder *)encoder

{

    encodeRuntime(Movie)

}

- (id)initWithCoder:(NSCoder *)decoder

{

    initCoderRuntime(Movie)

}

@end

我们可以把这两个宏单独放到一个文件里面,这里以后需要进行数据持久化的模型都可以直接使用这两个宏。

相关文章

  • runtime使用 自定义数据类型的编码解码

    通过runtime 遍历自定义model的所有属性实现归档解档操作。 要实现我们自定义的model能够自动解档归档...

  • runtime自动归档

    前言 善用runtime,可以解决自动归档解档。想想以前归档是手动写的,确实太麻烦了。现在有了runtime,我们...

  • runtime自动归档/解档

    前言 善用runtime,可以解决自动归档解档。想想以前归档是手动写的,确实太麻烦了。现在有了runtime,我们...

  • runtime自动解档归档

    如果你实现过自定义模型数据持久化的过程,那么你也肯定明白,如果一个模型有许多个属性,那么我们需要对每个属性都实现一...

  • runtime 解档归档

  • 归档解档--runtime

    不说废话,直接上代码。首先创建一个Person类。Person.h import

  • runtime 进行归档和解档

    数据本地持久化时, 一般会将模型进行归档, 从本地获取数据时, 需要解档下面使用runtime的方式进行归档解档,...

  • objc/runtime之——归档反归档

    以上原始手动解档归档代码下载地址如下 runtime实现归档解档代码下载地址如下可以直接拉入项目使用 为什么我们要...

  • iOS - runtime-04实现自动解归档

    通过 runtime 进行归档、解档很节省很多工作,我先贴一段常规的解归档的代码。 通过这种方式进行解归档很麻烦,...

  • runtime自动归档解档的坑

    本人在用runtime进行归档时遇到could not set nil as the value for the ...

网友评论

      本文标题:runtime自动解档归档

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