您好,登錄后才能下訂單哦!
字典對象與模型對象的轉換
從本地或者網絡獲取的數據,往往都是字典類型的。
這些字典數據往往字段固定,且以數組的形式存儲。
使用字典可能會帶來一些不利:
1. key不方便記憶且編譯器不進行正確性的驗證
2. 不能進行一些對象的操作
解決的方法是:
將固定字段的字典,封裝成自定義的對象,這種對象我們稱之為“模型”。
字典轉模型的步驟
1)創建模型類
屬性名應為對應詞典中的key字符串中的名字
屬性類型應為詞典中對應value的類型。
如:字典來自plist文件
@interface AMMusicModel : NSObject @property (nonatomic) NSString * song; @property (nonatomic) NSString * singer; @end
2)添加init及類方法創建模型類
@interface AMMusicModel : NSObject @property (nonatomic) NSString * song; @property (nonatomic) NSString * singer; - (instancetype)initWithDictionary:(NSDictionary*) dict; + (instancetype)modelWithDictionary:(NSDictionary*) dict; @end
3)將字典轉成模型對象,用屬性存儲
- (instancetype)initWithDictionary:(NSDictionary *)dict { if ( self = [super init] ) { self.song = dict[@"dict"]; self.singer = dict[@"singer"]; } return self; } + (instancetype)modelWithDictionary:(NSDictionary*) dict { return [[self alloc] initWithDictionary:dict]; }
4)在持有模型對象的類中添加屬性,往往是數組
@interface AMMusicListModel : NSObject @property (nonatomic) NSMutableArray * musicArray; @end
并在適合的位置,創建該數組:
NSString *path = @".../music.plist"; NSArray * plistArray = [NSArray arrayWithContentsOfFile:path]; self->_musicArray = [NSMutableArray array]; for ( NSDictionary * dict in plistArray) { AMMusicModel * model = [AMMusictModel modelWithDictionary:dict); [self->_musicArray addObject:model]; }
懶加載
是一種延遲加載方式,在需要的時候才加載
是一種內存調優的手段,能夠在一定程度上減少不必要內存的使用
具體做法:重寫屬性的getter方法
- (NSMutableArray*) musicArray { if ( _musicArray == nil ) { NSString *path = @".../music.plist"; NSArray * plistArray = [NSArray arrayWithContentsOfFile:path]; self->_musicArray = [NSMutableArray array]; for ( NSDictionary * dict in plistArray) { AMMusicModel * model = [AMMusictModel modelWithDictionary:dict); [self->_musicArray addObject:model]; } } return _musicArray; }
KVC
Key Value Coding,鍵值編碼協議NSKeyValueCoding,提供一種機制來間接訪問對象的屬性。
獲得值:
- (id)valueForKey:(NSString *)key
設置值:
- (void)setValue:(id)value forKey:(NSString *)key
路徑訪問方式:
存在復合關系時,通過 . 將屬性名連接成路徑訪問
如下圖,對象employee1中 包含屬性manager ,而manager中包含其他屬性
可以通過路徑字符串 @”manager.employee1”訪問
- (id)valueForKeyPath:(NSString *)keyPath - (void)setValue:(id)value forKeyPath:(NSString *)keyPath
意義:
1)提供了對象屬性的另一種有效的訪問方式
2)為KVO提供了實現基礎
...
模型轉字典
模型對象使用NSKeyValueCoding協議中的方法進行轉換
- (NSDictionary<NSString *,id> *)dictionaryWithValuesForKeys:(NSArray<NSString *> *)keys
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。