一.調(diào)用方法
YYGHUser *model = [YYGHUser yy_modelWithJSON:json];
二.內(nèi)部實(shí)現(xiàn)
+(instancetype)yy_modelWithJSON:(id)json{
? ? ? ? //json -> NSDictionary
? ? ? ? NSDictionary *dic = [self ?_yy_dictionaryWithJSON:json];
? ? ? ?//NSDictionary -> model
? ? ? return ? [self yy_modelWithDictionary:dic];
}
三.json轉(zhuǎn)dic
+(NSDictionary *)_yy_dictionaryWithJSON:(id)json{
? ? ? ? ? ? ?//1.如果json為空 return nil
? ? ? ? ? ?if(!json || json == (id)kCFNull) return nil;
? ? ? ? ? ? //2?
? ? ? ? ? ?NSDictionary *dic = nil;
? ? ? ? ? NSData *jsonData = nil;
? ? ? ? ?//3.判斷json是數(shù)據(jù)類型
? ? ? ? if([json isKindofClass:[NSDictionary class]]){
? ? ? ? ? ? ? ? ? ? //如果是NSDictionary類型 把json數(shù)據(jù)賦值給dic
? ? ? ? ? ? ? ? ? ? ?dic = json;
? ? ? ? ? }else if([json isKindofClass:[NSString class]]){
? ? ? ? ? ? ? ? ? ? ?//如果是NSString類型 把json數(shù)據(jù)進(jìn)行NSUTF8StringEncoding編碼得到NSData 然后賦值給jsonData
? ? ? ? ? ? ? ? jsonData = [(NSString *)json dataUsingEncoding:NSUTF8StringEncoding];
? ? ? ? }else if([json isKindofClass:[NSData class]]){
? ? ? ? ? ? ? ?//如果是NSData類型 直接賦值給jsonData
? ? ? ? ? ? ? ?jsonData = json;
? ? ? ?}
? ? ? ?if(jsonData){
? ? ? ? ? ? ? ? ?//如果jsondata數(shù)據(jù)不為空如输,調(diào)用系統(tǒng)方法NSData -》NSDictionary
? ? ? ? ? ? ? ? ? dic = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:NULL];
? ? ? ? ? ? ? ?//如果得到的dic 類型不是NSDictionary dic = nil
? ? ? ? ? ? ? ?if(![dic isKindOfClass:[NSDictionary class]]) dic = nil;
? ? ? }
? ? ?return dic;
}
四.字典轉(zhuǎn)Model
+(instancetype)yy_modelWithDictionary:(NSDictionary *)dictionary{
? ? ? ? ? ? ? ? ?//判斷NSDictionary 不為空
? ? ? ? ? ? ? ? if(!dictionary || dictionary == (id)kCFNull) return nil;
? ? ? ? ? ? ? ? //判斷dictionary是否是NSDictionary類型,如果不是NSDictionary類型央勒,return nil
? ? ? ? ? ? ? ?if(![dictionary isKindOfClass:[NSDictioary class]]) return nil;
? ? ? ? ? ? ? ?Class cls = [self class];
? ? ? ? ? ? ?_YYModelMeta *modelMeta = [_YYModelMeta metaWithClass:cls];
? ? ? ? ? ? if(modelMeta->_hasCustomClassFromDictionary){
? ? ? ? ? ? ? ? ? ? ?cls = [cls modelCustomClassForDictionary:dictionary]?:cls;
? ? ? ? ? ? }
? ? ? NSObject *one = [cls new];
? ? ? if([one yy_modelSetWithDictionary:dictionary]) return one;
? ? ?return nil;
}
1不见,
+(instancetype)metaWithClass:(Class)cls{
? ? ? ? ? ? ? ?if(!cls) return nil;
? ? ? ? ? ? ? ?//這里難道是要做一個(gè)緩存區(qū)域?
? ? ? ? ? ? ? static CFMutableDictionaryRef cache;
? ? ? ? ? ? ? static dispatch_once_t onceToken;
? ? ? ? ? ? ? static OSSpinLock lock;
? ? ? ? ? ? ? dispatch_once(&onceToken,^{
? ? ? ? ? ? ? ? ? ? cache = CFDictionaryCreateMutable(CFAllocatorGetDefault(),0,&kCFTypeDictionaryKeyCallBacks,&kCFTypeDictionaryValueCallBacks);
? ? ? ? ? ? ? ? ? /*! @abstract The default value for anOSSpinLock.? ? ? ? @discussion ? ? ? ? ? ? ? ? ?The convention is that unlocked is zero, locked is nonzero.? ? ? ? ? #define? ? OS_SPINLOCK_INIT? ? 0? ? ? ? ? 告訴我們OS_SPINLOCK_INIT 是一個(gè)默認(rèn)值崔步。? ? ? ? ? 不鎖定為0? ? ? ? ? 鎖定為非0稳吮;? ? ? ? */
? ? ? ? ? ? ? ? ? lock = OS_SPINLOCK_INIT;
? ? ? ? ? ?});
? ? ? ? ? ? /*! @abstract Locks a spinlock
? ? ? ? ? ? ? ?@discussion
? ? ? ? ? ? ? ?Although the lock operation spins, it employs various strategies
? ? ? ? ? ? ? to back off if the lock is held, making it immune to most priority-inversion
? ? ? ? ? ? ? livelocks.
? ? ? ? ? */
? ? ? ? ? ? OSSpinLockLock(&lock);
? ? ? ? ? ? ? //我猜這個(gè)是根據(jù)key等到value 相當(dāng)于? [NSDictionary objectForKey:@""];
? ? ? ? ? ? _YYModelMeta *meta = CFDictionaryGetValue(cache, (__bridge const void *)(cls));
? ? ? ? ? ? ? //解鎖
? ? ? ? ? ? ?OSSpinLockUnlock(&lock);
? ? ? ? ? ? //如果剛才沒有得到數(shù)據(jù)? 生成數(shù)據(jù)并存入cache
? ? ? ? ? ? if (!meta) {
? ? ? ? ? ? ? ? ? ? ?//這里是取得類的@property屬性或者全部信息,目前還沒有研究到
? ? ? ? ? ? ? ? ? ? ?meta = [[_YYModelMeta alloc] initWithClass:cls];
? ? ? ? ? ? ? ? ? ? ?if (meta) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? //存儲(chǔ)值井濒,下次可以直接讀取灶似,不需要在生成了列林。
? ? ? ? ? ? ? ? ? ? ? ? ? ? OSSpinLockLock(&lock);?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CFDictionarySetValue(cache, (__bridge const void *)(cls), (__bridge const void *)(meta));
? ? ? ? ? ? ? ? ? ? ? ? ? ? OSSpinLockUnlock(&lock);
? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? }
? ? ? return meta;
}