你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> YYModel使用教程

YYModel使用教程

編輯:IOS開發基礎

我最近在通讀 YYModel 源碼,在快速上手使用的時候,發現網上對 YYModel 的使用解釋很不完善。哪怕是 YY大神自己的使用說明,我直接復制拿來用也發現有用不了。所以有了這篇文章!這篇文章只對我認為需要補充的說明的方法進行說明。簡單用法不再贅述。(復制Json時不要把  //JSON這種同學復制進去,會解析失敗的。)

先對 YYModel的協議進行說明!

1.自定義屬性映射

+ (nullable NSDictionary*)modelCustomPropertyMapper;

//自定義類的屬性
@property NSString      *name;
@property NSInteger     page;
@property NSString      *desc;
@property NSString      *bookID;
//JSON
{    "n":"Harry Pottery",    
     "p": 256,    
     "ext" : {        
         "desc" : "A book written by J.K.Rowing."
     },    
     "id" : 100010
}

使用這個方法需要在自定義類裡面重寫該方法。

2.自定義容器映射

假如你的對象裡面有容器(set,array,dic),你可以指定類型中的對象類型,因為YYModel是不知道你容器中儲存的類型的。在dic中,你指定的是它 value 的類型。

+ ( NSDictionary*)modelContainerPropertyGenericClass;

@interface YYAuthor : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSDate *birthday;
@end@interface User : NSObject@property UInt64        uid;
@property NSString      *bookname;
@property (nonatomic, strong)   NSMutableArray    *authors;@end
{    "uid":123456,    "bookname":"Harry",    
     "authors":[{               "birthday":"1991-07-31T08:00:00+0800",               "name":"G.Y.J.jeff"},
                {               "birthday":"1990-07-31T08:00:00+0800",               "name":"Z.Q.Y,jhon"}]
}

\相當於泛型說明
+ (NSDictionary *)modelContainerPropertyGenericClass {    
return @{@"authors" : [YYAuthor class]};
}

3.根據字典返回類型

這個方法是可以根據字典裡的 數據 來指定當前對象的類型。我對這個方法的理解,假如 Person 是父類,其子類是 Man,Woman。這個時候你可以根據 dic["sex"]中的 value,比如value為 NSString 的 Man,在重寫的方法裡 return Man.這個時候,你當前的字典轉模型的實例就是 Man的實例對象。(此處的 dic就是網絡獲取的 Json轉成的 Dict。

注:這就是多態。

+ (nullable Class)modelCustomClassForDictionary:(NSDictionary*)dictionary;

{    "name":"Jeff",    "age":"26",    "sex":"Man",    "wifeName":"ZQY"}

//.h@interface Person : NSObject
@property (nonatomic, copy)     NSString        *name;
@property (nonatomic, assign)   NSUInteger      age;
@end@interface Man : Person
@property (nonatomic, copy)     NSString        *wifeName;@end@interface Woman : Person
@property (nonatomic, copy)     NSString        *husbandName;
@end

//.m+ (Class)modelCustomClassForDictionary:(NSDictionary*)dictionary {    
    if (dictionary[@"sex"] != nil) {        
        NSString *runClass = dictionary[@"sex"];        
        return NSClassFromString(runClass);
    } else {        
        return [self class];
    }
}
NSData *dataPerson = [self dataWithPath:@"person"];    
Person *person = [Person modelWithJSON:dataPerson];    
[person modelDescription];

這個時候你會發現,當前person的類實際上是 Man,而不是 Person。

4.白名單,黑名單

+ (nullable NSArray *)modelPropertyBlacklist;                            黑名單
+ (nullable NSArray *)modelPropertyWhitelist;                            白名單

這兩個比較簡單。

黑名單,故名思議,黑名單中的屬性不會參與字典轉模型。

白名單使用比較極端,你用了之後,只有白名單中的屬性會參與字典轉模型,其他屬性都不參與。不推薦使用。

//使用了黑名單,將來會剔除黑名單中的屬性
+ (NSArray *)modelPropertyBlacklist {    
    return @[@"blackListTest"];
}

//白名單使用比較極端,只有白名單中的可以通過。    正常情況使用黑名單即可。
+ (NSArray *)modelPropertyWhitelist {    
    return @[@"name"];
}


5.更改字典信息

該方法發生在字典轉模型之前。 最後對網絡字典做一次處理。

- (NSDictionary *)modelCustomWillTransformFromDictionary:(NSDictionary *)dic;

\原來json{    "name":"Jeff",    "age":"26",    "sex":"Man",    "wifeName":"ZQY"}
\更改後{}

- (NSDictionary *)modelCustomWillTransformFromDictionary:(NSDictionary *)dic{    
    if ([dic[@"sex"] isEqualToString:@"Man"]) {        
        return nil;//這裡簡單演示下,直接返回 nil。相當於不接受男性信息。
    }    
    return dic;//女性則不影響字典轉模型。
}

6.字典轉模型補充

- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic;

@interface User : NSObject
@property UInt64        uid;
@property NSDate        *created;
@property NSDate        *createdAt;
@property NSString      *bookname;@end
{"uid":123456,    "bookname":"Harry",    "created":"1965-07-31T00:00:00+0000",    "timestamp" : 1445534567}

字典轉模型結束後createdAt屬性應該是空的,因為timestamp 和 createdAt 不一樣。但你在這裡賦值,手動把timestamp的屬性賦值給_createdAt.這個有點類似第一點的 自定義屬性映射(本篇文章第一條)。
注:此處如果 return NO,dic->model將失敗。

- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {    
    NSNumber *timestamp = dic[@"timestamp"];    
    if (![timestamp isKindOfClass:[NSNumber class]]) return NO;
    _createdAt = [NSDate dateWithTimeIntervalSince1970:timestamp.floatValue];    
    return YES;
}

7.模型轉字典補充

- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic;

這個方法和第6條是相對應的關系。這裡是model->json 的補充。

假如自己model 中有_createdAt,那 model 轉到 json 中的timestamp會被賦值。

- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic {    
    if (!_createdAt) return NO;
    dic[@"timestamp"] = @(_createdAt.timeIntervalSince1970);    
    return YES;
}

注:此處如果 return NO,model->dict將失敗。

8.字典用法和數組的用法

+ (nullable NSArray *)modelArrayWithClass:(Class)cls json:(id)json;
+ (nullable NSDictionary *)modelDictionaryWithClass:(Class)cls json:(id)json;
 [{"birthday":"1991-07-31T08:00:00+0800",  "name":"G.Y.J.jeff"},
  {"birthday":"1990-07-31T08:00:00+0800",  "name":"Z.Q.Y,jhon"}]
@class YYAuthor;@interface YYAuthor : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSDate *birthday;
@end
    NSData *dataArr = [self dataWithPath:@"arrayTest"];    
    NSArray *arrT = [NSArray modelArrayWithClass:[YYAuthor class] json:dataArr];    
    NSLog(@"arrT = %@",arrT);

+ (NSDictionary *)modelDictionaryWithClass:(Class)cls json:(id)json;

這個方法的意思是只會在對字典的 value 用cls去解析。無法解析key:{key:value(cls)},這種嵌套的解析無法進行。只會解析第一層的。

{
"user1": {    
    "birthday":"1990-07-31T08:00:00+0800",    
    "name":"1Z.Q.Y,jhon"},
"user2":{    
    "birthday":"1990-07-31T08:00:00+0800",    
    "name":"2Z.Q.Y,jhon"},
"user3":{"user4":{    
    "birthday":"1990-07-31T08:00:00+0800",    
    "name":"3Z.Q.Y,jhon"}
    }
}
    NSData *dataDict = [self dataWithPath:@"dicTest"];    
    NSDictionary *dicT = [NSDictionary modelDictionaryWithClass:[YYAuthor class] json:dataDict];    
    NSLog(@"dicT = %@",dicT);

如果對使用方法還略有不懂,可以下載我的 github 上的工程。裡面都是經過測試的。

下面的源碼是我在讀 YYModel 時添加的大量備注,和 YYModel 的簡單使用介紹。

源碼地址 :https://github.com/PomTTcat/YYModelGuideRead_JEFF

這篇文章沒講 model->json,因為那個太簡單了。平時使用重點是json->model。

最後的最後,哪裡不明白可以一起交流技術!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved