美文网首页
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