文档章节

BaseModel-给你的Model插上翅膀

iOS赵师顺
 iOS赵师顺
发布于 2018/06/02 11:45
字数 709
阅读 74
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

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

<!--more-->

打造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
****>
上一篇: 瀑布流
下一篇: iOS 理解内存管理
iOS赵师顺
粉丝 3
博文 74
码字总数 36150
作品 0
昌平
程序员
私信 提问
加载中
请先登录后再评论。
Go 的 Web 框架--Golanger

Golanger 是一个轻量级的 Web 应用框架,使用 Go 语言编写。 Golanger框架主要实现了MVC模式(三层架构模式)(Model-View-Controller), 它是软件工程中的一种软件架构模式,把软件系统分为三个...

余风11
2012/11/23
9.1K
1
phalcon-入门篇8(Model层基础使用2)

本教程基于phalcon2.0.9版本 先在这里感谢各位phalcon技术爱好者,我们提供这样一个优秀的交流平台 在上一节我们已经介绍了,phalcon-Model层的配置和最简单的CURD的使用,那么你认为这样就完了...

喵了_个咪
2016/03/01
936
3
深入Spring:自定义ViewResolver

前言 上一篇文章介绍了SpringMvc的ControllerAdvice和ExceptionHandler,这里在介绍一下ViewResolver的使用,并介绍一下HandlerMethodReturnValueHandler和ViewResolver的关系。 ViewResolv...

wcong
2016/06/02
594
0
室内GIS开发,未来企业地图的发展方向

究竟,从哪些端倪可以看出,GIS的发展已经到了即将爆发的边缘。或许,我们可以从那些闯入我们眼帘的陌生行业来判断这个产业的发展前景? 更详实的数据,更快速的传递,更及时的更新,可以说,...

GIS分享
2014/08/13
27
0
迅为iTOP-4412开发板Linux系统下如何配置wifi模块

本文转自迅为讨论区:http://www.topeetboard.com 精英版在 linux 下使用 wifi,需要进行下面的配置: 首先用户在拿到光盘资料以后查看下光盘里面的“linux”->”root_xxxxxxxx.tar.gz”文件...

歌之王子殿下
2015/05/26
565
2

没有更多内容

加载失败,请刷新页面

加载更多

如何用Postman做接口自动化测试

目录 前言 什么是自动化测试 自动化测试有哪些分类 为什么需要自动化测试 Postman自动化测试演示 1.新建集合 2.新建接口 3.填写自动化测试脚本 4.录入所有接口 5.执行自动化测试 前言 什么是...

osc_71qxolcv
6分钟前
0
0
下载Crypto,CyCrypto,PyCryptodome 报错问题

python下载Crypto,CyCrypto,PyCryptodome,如有site-packages中存在crypto、pycrypto,在pip之前,需要pip3 uninstall crypto、pip3 uninstall pycrypto,否则无法安装成功。这里顺带说一下...

osc_pl4ni83h
7分钟前
0
0
HashMap JDK1.8实现原理

HashMap概述 HashMap存储的是key-value的键值对,允许key为null,也允许value为null。HashMap内部为数组+链表的结构,会根据key的hashCode值来确定数组的索引(确认放在哪个桶里),如果遇到索...

osc_cx8uhydz
9分钟前
0
0
快速打造属于你的接口自动化测试框架

1 接口测试 接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。 接口自动化相对于UI自动化来说,属于更底层的测试,这样带来的好...

osc_4eht81t7
10分钟前
0
0
MVC的Action上下文:ActionExecutingContext

就上图来看,大家注意了吗,ActionExecutingContext对象一共有3处引用。下面我来一一解析: 调用base.OnActionExecuting(filterContext)这个后,才会执行后续的ActionFilter,如果你确定只有一...

osc_4otxquc2
11分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部