登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

查看: 759|回复: 9

[代码分享] 完美解决自定义类归档解档问题

[复制链接]

4

主题

12

帖子

1130

金钱

iOS大神

Rank: 6Rank: 6

发表于 2016-12-5 18:49:47 | 显示全部楼层 |阅读模式

XBCodingObject

先前做APP做离线的时候经常遇到有需求要把自定义模型存入数据库,但是需要实现NSCoding协议的两个方法,模型属性少的时候还有,还有耐心些,但是当有100个属性的时候难道还一个个写吗,程序员写代码就是要避免重复的代码,这里作者只是帮助开发者省去了这些复杂没有技术的代码,其次能更有效的提高开发效率.

自定义类person类

#import "XBCodingObject.h"
#import "XBDog.h"

@interface XBPerson : XBCodingObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *age;

/**
 狗类
 */
@property (nonatomic, strong) XBDog *dog;

/**
 数组里面装的是猫类
 */
@property (nonatomic, strong) NSArray *cats;

@end

自定义dog类

#import "XBCodingObject.h"

@interface XBDog : XBCodingObject

@property (nonatomic, copy) NSString *dogName;
@property (nonatomic, copy) NSString *dogAge;

@end

自定义cat类

#import "XBCodingObject.h"

@interface XBCat : XBCodingObject

@property (nonatomic, copy) NSString *catName;
@property (nonatomic, copy) NSString *catAge;

@end

用法

#import "ViewController.h"
#import "XBPerson.h"
#import "XBCat.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSMutableArray *array = [NSMutableArray arrayWithCapacity:3];
for (int i = 0; i < 3; ++i) {
    XBPerson *person1 = [[XBPerson alloc] init];
    person1.name = @"123";
    person1.age = @"aaaa";
    
    XBDog *dog = [[XBDog alloc] init];
    dog.dogName = @"哈哈哈";
    dog.dogAge = @"111";
    person1.dog = dog;
    NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:3];
    for (int i = 0; i < 3; ++i) {
        XBCat *cat = [[XBCat alloc] init];
        cat.catName = @"444";
        cat.catAge = @"555";
        [tempArray addObject:cat];
    }
    person1.cats = tempArray;
    
    [array addObject:person1];
    }
    // 这里可以直接实现归档方法
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];
    // 解档
    NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    NSLog(@"%@", arr);
}

核心代码

// 获取所有属性列表
- (NSArray *)properties {
    NSMutableArray *properties = [NSMutableArray array];
    unsigned int count = 0;
       Ivar *propertyArr = class_copyIvarList([self class], &count);
    objc_property_t *propertyArray = class_copyPropertyList([self class], &count);
    for (int i = 0; i < count; i++) {
       Ivar property = propertyArr[i];
       const char *propertyNameC = ivar_getName(property);
        NSString *propertyNameOC = [[NSString alloc] initWithCString:propertyNameC encoding:NSUTF8StringEncoding];
    [properties addObject:propertyNameOC];
}
    free(propertyArray);
    return properties;
}

// 把所有属性归档
- (void)encodeWithCoder:(NSCoder *)aCoder {
    NSArray *propertyArray = [self properties];
    for (NSString *property in propertyArray) {
        [aCoder encodeObject:[self valueForKey:property] forKey:property];
    }    
}

// 对所有属性解档
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self == [super init]) {
        for (NSString *property in [self properties]) {
        [self setValue:[aDecoder decodeObjectForKey:property] forKey:property];
        }
    }
    return self;
}

有任何问题可以联系作者:QQ447808449

code4app

Simulator Screen Shot 2016年12月5日 18.47.15.png

coding协议.zip

87.62 KB, 下载次数: 215

17

主题

1774

帖子

1346

金钱

iOS大神

Rank: 6Rank: 6

发表于 2016-12-6 11:40:09 | 显示全部楼层
虽不明,但觉厉...

0

主题

1759

帖子

-413

金钱

限制会员

发表于 2016-12-6 11:41:29 | 显示全部楼层
内容很好,棒棒哒

23

主题

1789

帖子

1152

金钱

iOS大神

Rank: 6Rank: 6

分享大神

发表于 2016-12-6 11:43:12 | 显示全部楼层
学习...学习...

3

主题

1752

帖子

194

金钱

VIP1

Rank: 7Rank: 7Rank: 7

发表于 2016-12-6 11:44:25 | 显示全部楼层
感谢分享,code4app有你更精彩

11

主题

1764

帖子

952

金钱

代码手工艺人

Rank: 4

发表于 2016-12-6 11:46:35 | 显示全部楼层
感谢分享,楼主V5~

18

主题

1767

帖子

1677

金钱

iOS大神

Rank: 6Rank: 6

发表于 2016-12-6 11:51:15 | 显示全部楼层
小弟学习了~支持,支持
code4app热心网友  发表于 2016-12-7 08:30:22
楼主用心了,内容非常精彩。
code4app热心网友  发表于 2016-12-7 08:43:07
强烈支持楼主ing……

4

主题

12

帖子

1130

金钱

iOS大神

Rank: 6Rank: 6

 楼主| 发表于 2016-12-7 09:10:04 | 显示全部楼层
虽不明,但觉厉!
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

关闭

每日头条

通过邮件订阅最新 Code4App 信息
上一条 /4 下一条

广告投放| Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

快速回复 返回顶部 返回列表