字典转单例Model对象的问题
今天工作中,遇到一个坑,项目使用YYModel进行字典模型转换的。先看下Demo代码:
- 定义一个模型类:
@interface singleModel : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *sex;
@property (nonatomic, copy) NSString *age;
@property (nonatomic, copy) NSString *address; ```
* 这是正常使用YYmodel 字典转模型的姿势:
NSDictionary *dic = @{@"name":@"zhangsan",@"sex":@"man",@"age":@"17",@"address":@"jiangsu"};
singleModel *model = [singleModel yy_modelWithDictionary:dic];
NSLog(@"%@",model.name);
从打印结果来看是很正常的,没问题,接下来,看下面代码:
* 先在模型类中添加单例方法:
- (instancetype)shared{
static singleModel *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}```
在控制器中代码如下:
NSDictionary *dic = @{@"name":@"zhangsan",@"sex":@"man",@"age":@"17",@"address":@"jiangsu"};
singleModel *model = [singleModel shared];
model = [singleModel yy_modelWithDictionary:dic];
NSLog(@"%@",model.name);
NSLog(@"%@",[singleModel shared].name);
我们看下控制台的打印结果:
,
不知道你们看到这个结果,是什么表情,反应由于我学艺不精,我是醉了,不理解为什么,从打印结果和左面看内存中的值,是已经赋值成功了的,为毛,通过单例取值的时候是nil 呢???
通过指针,应该可以看出端倪了,纳尼,竟然不是一个地址,那应该就明白了,为什么通过这种方式,单例对象赋值失败了。
那有什么办法,可以解决这个办法呢?要是对象有十几个属性,我要一个一个属性赋值么,这样太麻烦了,我们可以通过KVC的方式来解决。
看代码:
NSDictionary *dic = @{@"name":@"zhangsan",@"sex":@"man",@"age":@"17",@"address":@"jiangsu"};
singleModel *model = [singleModel shared];
[model setValuesForKeysWithDictionary:dic];
NSLog(@"%@",model.name);
NSLog(@"%@",[singleModel shared].name);
看结果:
可以看到 ,这样的指针是一样的,通过这种方法,就可以解决这一问题了,有一点要注意,当字典里里的key,我们mdel类没有定义的时候,会崩溃,如下:
这就是因为 字典里的key "school" 在model里没有,这是我们只需要在模型类实现此方法就好了:
- (void)setValue:(id)value forUndefinedKey:(nonnull NSString *)key{
NSLog(@"%@",key);
}
string 转 Date 的总是相差8小时的问题
代码如下:
从打印台,看到却是是相差8小时,原因是因为默认是GMT格林威治时间,我们转换成UTC 世界时间 ,就好了,完整代码如下:
NSString *timeStr = @"2016-10-28 10:16";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-HH-dd HH:mm"];
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
NSDate *date = [[NSDate alloc] init];
date = [formatter dateFromString:timeStr];
NSLog(@"%@",date);