標籤:
最近在看MJExtension的Demo,發現了一個plist檔案直接轉數組模型的方法。以前研究過但是淺嘗輒止沒有解決,這幾天有時間,好好看了看,找到瞭解決辦法,與大家分享。
如果大家的項目中有這種嵌套數組對象的情況的plist檔案,如:
即要轉換成一個對象中存有另一個對象數組的情況。
當沒有這種複雜嵌套時,我們這樣寫:
1: -(NSArray *)groups{
2: if (!_groups) {
3:
4: _groups = [Group objectArrayWithFilename:@"cars_total.plist"];
5: }
6: return _groups;
7: }
但是這樣的話groups中的cars屬性會被賦成一個 “含有NSDictionary的NSArray”變數,而不是“含有Car類的NSArray”
並沒有真正的轉成模型,一開始我的解決方案是重寫setCars方法,
//-(void)setCars:(NSArray *)cars{//// NSLog(@"%s",__func__);// _cars = [NSMutableArray array];// _cars = [Car modelArrayWithDictionaries:cars];//}
modelArrayWithDictionaries是我自己實現的一個Dictionary數組轉對象數組的方法,寫的不優雅就不貼出來了。
但是我們實際上是可以這樣寫的:
寫法一:
在Group模型中
1: //+(NSDictionary *)objectClassInArray{
2: // return @{@"cars":@"Car"};
3: //}
寫法二:
在groups屬性的getter裡
1: (NSArray *)groups{
2: if (!_groups) {
3:
4: [Group setupObjectClassInArray:^NSDictionary *{
5: return @{@"cars":@"Car"};
6: }];
7: _groups = [Group objectArrayWithFilename:@"cars_total.plist"];
8: }
9: return _groups;
10: }
就可以實現直接轉換成對象啦!
關於MJExtension Demo中的其他發現:
MJExtension的Demo中將 [x setupObjectClassInArray:…]放到了MJExtensionConfig
類的+load方法中,Demo中其他地方沒有任何對該類或該方法的引用。
經過查詢,發現原來load是OC中在載入一個類的時候自動調用的方法,真是一個進行配置的好方法!
參考來源:
Objective-C 類方法 load 和 initialize 的區別
iOS MJExtension架構之字典數組轉模型數組
CoderMJLee/MJExtension
iOS開發——MJExtension複雜數組用法