字典轉(zhuǎn)單例Model對(duì)象的問題
今天工作中祭饭,遇到一個(gè)坑瓮床,項(xiàng)目使用YYModel進(jìn)行字典模型轉(zhuǎn)換的盹舞。先看下Demo代碼:
- 定義一個(gè)模型類:
@interface singleModel : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *sex;
@property (nonatomic, copy) NSString *age;
@property (nonatomic, copy) NSString *address; ```
* 這是正常使用YYmodel 字典轉(zhuǎn)模型的姿勢:
NSDictionary *dic = @{@"name":@"zhangsan",@"sex":@"man",@"age":@"17",@"address":@"jiangsu"};
singleModel *model = [singleModel yy_modelWithDictionary:dic];
NSLog(@"%@",model.name);
從打印結(jié)果來看是很正常的产镐,沒問題,接下來踢步,看下面代碼:
* 先在模型類中添加單例方法:
- (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);
我們看下控制臺(tái)的打印結(jié)果:
singleDemo.png
癣亚,
不知道你們看到這個(gè)結(jié)果,是什么表情获印,反應(yīng)由于我學(xué)藝不精述雾,我是醉了,不理解為什么兼丰,從打印結(jié)果和左面看內(nèi)存中的值玻孟,是已經(jīng)賦值成功了的,為毛鳍征,通過單例取值的時(shí)候是nil 呢黍翎??艳丛?
看地址.png
通過指針匣掸,應(yīng)該可以看出端倪了,納尼质礼,竟然不是一個(gè)地址旺聚,那應(yīng)該就明白了,為什么通過這種方式眶蕉,單例對(duì)象賦值失敗了砰粹。
那有什么辦法,可以解決這個(gè)辦法呢造挽?要是對(duì)象有十幾個(gè)屬性碱璃,我要一個(gè)一個(gè)屬性賦值么,這樣太麻煩了饭入,我們可以通過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);
看結(jié)果:
singleDemo2.png
可以看到 ,這樣的指針是一樣的谐丢,通過這種方法爽航,就可以解決這一問題了,有一點(diǎn)要注意乾忱,當(dāng)字典里里的key讥珍,我們mdel類沒有定義的時(shí)候,會(huì)崩潰,如下:
crash.png
這就是因?yàn)?字典里的key "school" 在model里沒有窄瘟,這是我們只需要在模型類實(shí)現(xiàn)此方法就好了:
- (void)setValue:(id)value forUndefinedKey:(nonnull NSString *)key{
NSLog(@"%@",key);
}
string 轉(zhuǎn) Date 的總是相差8小時(shí)的問題
代碼如下:
string 轉(zhuǎn)date.png
從打印臺(tái)衷佃,看到卻是是相差8小時(shí),原因是因?yàn)槟J(rèn)是GMT格林威治時(shí)間蹄葱,我們轉(zhuǎn)換成UTC 世界時(shí)間 氏义,就好了锄列,完整代碼如下:
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);