美文网首页
Runtime(六)自动化归解档

Runtime(六)自动化归解档

作者: 炒河粉儿 | 来源:发表于2019-08-16 11:08 被阅读0次

前言

实现自定义模型数据的持久化,通过encodeObject 和decodeObjectForKey方法,每一个属性都需要实现一边归档和解档的方法。传统的方式是这样实现的。

@interface Movie : NSObject<NSCoding>

@property (nonatomic, copy) NSString *movieId;
@property (nonatomic, copy) NSString *movieName;
@property (nonatomic, copy) NSString *pic_url;

@end
#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

如果有很多个属性的话,每个属性都写一遍,这显然是很繁琐的一件事情。我们可以利用runtime进行自动化归解档。

思想

利用runtime,动态获取到类的成员遍历列表,对列表进行遍历,并将对应的key和value进行归解档的操作,可以便捷的实现该效果。

- (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;
}

相关文章

网友评论

      本文标题:Runtime(六)自动化归解档

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