字典转单例模型和NSString转Date中的坑

字典转单例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); 

我们看下控制台的打印结果:


字典转单例模型和NSString转Date中的坑_第1张图片
singleDemo.png

不知道你们看到这个结果,是什么表情,反应由于我学艺不精,我是醉了,不理解为什么,从打印结果和左面看内存中的值,是已经赋值成功了的,为毛,通过单例取值的时候是nil 呢???

字典转单例模型和NSString转Date中的坑_第2张图片
看地址.png

通过指针,应该可以看出端倪了,纳尼,竟然不是一个地址,那应该就明白了,为什么通过这种方式,单例对象赋值失败了。

那有什么办法,可以解决这个办法呢?要是对象有十几个属性,我要一个一个属性赋值么,这样太麻烦了,我们可以通过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); 

看结果:

字典转单例模型和NSString转Date中的坑_第3张图片
singleDemo2.png

可以看到 ,这样的指针是一样的,通过这种方法,就可以解决这一问题了,有一点要注意,当字典里里的key,我们mdel类没有定义的时候,会崩溃,如下:


字典转单例模型和NSString转Date中的坑_第4张图片
crash.png

这就是因为 字典里的key "school" 在model里没有,这是我们只需要在模型类实现此方法就好了:

- (void)setValue:(id)value forUndefinedKey:(nonnull NSString *)key{
    NSLog(@"%@",key);
}

string 转 Date 的总是相差8小时的问题

代码如下:


字典转单例模型和NSString转Date中的坑_第5张图片
string 转date.png

从打印台,看到却是是相差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); 

你可能感兴趣的:(字典转单例模型和NSString转Date中的坑)