乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      iOS 字典轉(zhuǎn)模型Model

       新進(jìn)小設(shè)計(jì) 2022-01-18

       

      基本原理

      利用 runtime 原理,獲取模型中所有實(shí)例變量列表,根據(jù)實(shí)例變量以此獲取模型中成員變量的名稱和屬性類型,區(qū)分Foundation和自定義屬性,需要對NSDictionary和NSArray類型做單獨(dú)處理。

      下面代碼是一個(gè)簡單的原理實(shí)現(xiàn)Demo,真正的框架中需要考慮很多問題,例如可以設(shè)置只有某個(gè)數(shù)組中的屬性名才允許進(jìn)行字典和模型的轉(zhuǎn)換,將屬性名換為其他key去字典中取值,白名單,黑名單等等設(shè)置

       

      + (instancetype)modelWithDict:(NSDictionary *)dict
      {
          id objc = [[self alloc] init];
          
          unsigned int count = 0;
          
          Ivar *ivarList = class_copyIvarList(self, &count);
          
          for (int i = 0; i < count; i++) {
              
              // 實(shí)例變量
              Ivar ivar = ivarList[i];
              
              // 獲取成員屬性名
              NSString *ivarName = [NSString stringWithUTF8String:ivar_getName(ivar)];
              NSString *key = [ivarName substringFromIndex:1];
              
              id value = dict[key];
              if (value == nil) {
                  continue;
              }
              
              // 獲得成員變量的類型
              NSString *ivarType = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];
              NSLog(@"ivar - %@, type - %@", ivarName, ivarType);
              ivarType = [ivarType stringByReplacingOccurrencesOfString:@"\"" withString:@""];
              ivarType = [ivarType stringByReplacingOccurrencesOfString:@"@" withString:@""];
              
              if ([value isKindOfClass:[NSDictionary class]]) {
                  
                  Class modelClass = NSClassFromString(ivarType);
                  value = [modelClass modelWithDict:value];
                  
              } else if ([value isKindOfClass:[NSArray class]]) {
      
                  if ([self respondsToSelector:@selector(arrayContainModelClass)]) {
                  
                      NSString *type = [self arrayContainModelClass][key];
                      Class classModel = NSClassFromString(type);
                      NSMutableArray *arrM = [NSMutableArray array];
                      for (NSDictionary *dict in value) {
                          id model =  [classModel modelWithDict:dict];
                          if (model) {
                              [arrM addObject:model];
                          }
                      }
      
                      value = arrM;
                  }
              }
      
              if (value) {
                  [objc setValue:value forKey:key];
              }
          }
          
          return objc;
      }

       

       

       

       

       

      常用的 JSON 模型轉(zhuǎn)換庫

      • YYModel:支持自動的 JSON/Model 轉(zhuǎn)換,支持定義映射過程。API 簡潔,功能也比較簡單。
      • JSONModel:一個(gè) JSON 模型轉(zhuǎn)換庫,有著比較簡潔的接口。Model 需要繼承自 JSONModel。
      • Mantle:Github 官方團(tuán)隊(duì)開發(fā)的 JSON 模型轉(zhuǎn)換庫,Model 需要繼承自 MTLModel。
      • MJExtension:國內(nèi)開發(fā)者"小碼哥"開發(fā)的 JSON 模型庫,號稱性能超過 JSONModel 和 Mantle,使用簡單無侵入。

      性能、易用性,無浸入性

      根據(jù) ibireme 的測試結(jié)果:

      • Mantle 在各個(gè)測試中,性能都是最差的

      • JSONModel 和 MJExtension 性能相差不多,但都比 Mantle 性能高。

      • YYModel 性能高出其他幾個(gè)庫一個(gè)數(shù)量級,接近手寫代碼的效率。

      • YYModel、MJExtension 都是采用 Category 方式來實(shí)現(xiàn)功能,比較靈活,無侵入

      • 如果數(shù)據(jù)量在很小的時(shí)候,其實(shí)沒有可比性的,就好比100ms 和 300ms 的差距,用戶是感知不到的,最重要的還是框架的易用性,擴(kuò)展性,容錯(cuò)性,和無侵入性。

      • 如果對性能、網(wǎng)絡(luò)流量等有更高的要求,就不要再用 JSON 了,建議改用 protobuf/FlatBuffers 這樣的方案。JSON 轉(zhuǎn)換再怎么優(yōu)化,在性能和流量方面還是遠(yuǎn)差于二進(jìn)制格式的。

      • 進(jìn)行對象類型檢查,避免將錯(cuò)誤的對象類型賦值到屬性,以避免潛在的 Crash 問題。 YYModel 會嘗試自動轉(zhuǎn)換,轉(zhuǎn)換失敗時(shí)留空。對部分對象進(jìn)行自動轉(zhuǎn)換(比如 NSString 和 NSNumber 之間的轉(zhuǎn)換)

      • 具體容錯(cuò)處理,可能沒有框架的設(shè)計(jì)者有自己不同的考慮,就是想讓用戶自己去做容錯(cuò)處理。



        本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多