给你的Model插上翅膀

作者: 逾期的誓言 | 来源:发表于2018-05-24 18:17 被阅读36次

个人博客地址
给你的Model插上翅膀,自带归档、反归档功能,能够直接写入沙盒,或从沙盒中读取,打印你的Model可以直接看见内部属性。

打造BaseModel

实际开发中无论MVVM、MVC、还是MVP都有Model的存在,一个好的BaseModel可以精简代码,提高效率;来吧,集成本Model 愉快的使用MJExtension,JSONModel吧。


#import <Foundation/Foundation.h>

@interface BaseModel : NSObject <NSCoding>

@end

#import "BaseModel.h"
#import <objc/runtime.h> //导入Runtime 

@implementation BaseModel

#pragma mark - 解档方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        NSArray * porpertyArray = [self getAllPropertys];
        for (NSString *string in porpertyArray) {
            NSString *key = [string substringFromIndex:1];
            [self setValue:[aDecoder decodeObjectForKey:[NSString stringWithFormat:@"%@",key]] forKey:key];
        }
    }
    return self;
}
#pragma mark - 归档方法
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    //获取所有属性
    NSArray * porpertyArray = [self getAllPropertys];
    for (NSString * name in porpertyArray) {
        //去掉属性名前面的_
        NSString * key = [name substringFromIndex:1];
        //约定好的键值对 c+key
        [aCoder encodeObject:[self valueForKey:key] forKey:[NSString stringWithFormat:@"%@",key]];
    }
}
#pragma mark - 获取model的所有属性
-(NSArray *)getAllPropertys{
    NSMutableArray * array = [[NSMutableArray alloc]init];
    unsigned int * count = malloc(sizeof(unsigned int));
    //调用runtime的方法
    //Ivar:方法返回的对象内容对象,这里将返回一个Ivar类型的指针
    //class_copyIvarList方法可以捕获到类的所有变量,将变量的数量存在一个unsigned int的指针中
    Ivar * mem = class_copyIvarList([self class], count);
    //进行遍历
    for (int i=0; i< *count ; i++) {
        //通过移动指针进行遍历
        Ivar var = * (mem+i);
        //获取变量的名称
        const char * name = ivar_getName(var);
        NSString * str = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
        [array addObject:str];
    }
    //释放内存
    free(count);
    //注意处理野指针
    count=nil;
    return array;
}
#pragma mark - description
- (NSString *)description
{
    NSString *keyValue = @"\n";
    NSArray * porpertyArray = [self getAllPropertys];
    for (NSString *string in porpertyArray) {
        NSString *key = [string substringFromIndex:1];
        NSString *value = [self valueForKey:key];
        keyValue = [keyValue stringByAppendingString:[NSString stringWithFormat:@"%@=%@\n",key,value]];
    }
    NSString *name =  NSStringFromClass([self class]);
    return [NSString stringWithFormat:@"\n<****\n%@: %@****>",name,keyValue];
}
@end

继承BaseModel

继承BaseModel ,你即将给你的Model插上翅膀

#import "BaseModel.h"

@interface HomeModel : BaseModel
@property (nonatomic,copy)NSString *name;
@property (nonatomic,copy)NSString *sex;
@property (nonatomic,assign)NSInteger age;
@end
#import "HomeModel.h"

@implementation HomeModel

@end

验证是否可以飞行

自定义对象写入沙盒 (复杂对象->归档->NSData->writeToFile)
(1)先归档 (遵循NSCoding协议,实现encodeWithCoder、initWithCoder方法)
(2)后写入

- (void)viewDidLoad {
    [super viewDidLoad];
    HomeModel *model = [[HomeModel alloc]init];
    model.name = @"iOSCoderZhao";
    model.sex = @"男";
    model.age = 18;
    // 写入沙盒
    [self archiverWithModel:model];
    // 沙盒读取
    [self enchiver];
}
- (void)archiverWithModel:(HomeModel *)model
{
    // 归档
    NSMutableData *data = [NSMutableData data];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
    [archiver encodeObject:model forKey:@"model"];
    [archiver finishEncoding];//结束归档
    
    // 存储路径(写入document路径)
    NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *pathString = [document stringByAppendingPathComponent:@"dataPath"];
    [data writeToFile:pathString atomically:YES];
}

- (void)enchiver
{
    // 路径
    NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *pathString = [document stringByAppendingPathComponent:@"dataPath"];
    NSData *data = [NSData dataWithContentsOfFile:pathString];
    // 解档
    NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
    HomeModel *model = [unArchiver decodeObjectForKey:@"model"];
    [unArchiver finishDecoding];
    NSLog(@"%@",model);
}

控制台结果

<****
HomeModel: 
name=iOSCoderZhao
sex=男
age=18
****>

相关文章

  • 给你的Model插上翅膀

    个人博客地址给你的Model插上翅膀,自带归档、反归档功能,能够直接写入沙盒,或从沙盒中读取,打印你的Model可...

  • 给你的不屈插上翅膀

    你再善奔, 荒野中也跑不过瓢泼的雨滴! 你再善泳, 也游不出无礁的大海! 寂寞的奋斗不是勇者, 带着柔软在雨后的晨...

  • 爱的翅膀

    我想让爱插上翅膀 飞到你的身边 带去一缕清风 给你清凉的慰藉 我想让爱插上翅膀 飞到你的身边 携上我唇角的笑意 送...

  • 插上翅膀

  • 插上翅膀。

    (作词:芦俊) 曾经在雨中徘徊, 何时能回到天上之巅。 生活被戈壁掩埋, 水深火热无法前行。 插上翅膀。 翅膀被烦...

  • 插上翅膀

    为诗插上翅膀伴着海浪般的节奏带我腾空而起伴激情飞向远方翻开短小精美的文字散发重彩墨香 为慈善插上翅你会时常惊讶地发...

  • 插上信息的翅膀

    插上信息的翅膀 ...

  • 给你插上成功翅膀的心理资本

    4月10日下午,罗波老师为德慧智全纳公益协会的孩子们开启了第三次团体心理辅导活动,今天的主题是《给你插上成功翅膀的...

  • 读书给你听……

    读书给你听,是磨磨你的小耳朵,磨出一对利剑; 读书给你听,是为你插上一对想象的翅膀,随书飞翔; 读书给你听,是天籁...

  • 眼泪插上翅膀

    落寞的背影,眼泪的脚痕 还立在站台,挥手,不舍的 你裹着声音,哽咽,要等我 眼泪插上翅膀,眼泪插上翅膀 风里一个拥...

网友评论

    本文标题:给你的Model插上翅膀

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