MJExtension很強大攒射,幾乎支持現(xiàn)有所有的模型搁宾、字典、json數(shù)據(jù)轉(zhuǎn)換误证,而且效率非常高
以前寫對象歸檔的時候继薛,需要讓這個對象實現(xiàn)NSCoding協(xié)議,而且要對每一個需要歸檔的屬性做一些encode和decode操作愈捅,例如你之前的代碼可能是這樣子的
Person.h文件
#import"Person.h"@interfacePerson:NSObject@property(nonatomic,copy)NSString*name;@property(nonatomic,assign)intage;@property(nonatomic,assign)BOOLgay;@end
Person.m文件
#import"Person.h"@implementationPerson-(id)initWithCoder:(NSCoder*)aDecoder{if(self= [superinit]) {self.name = [aDecoder decodeObjectForKey:@"name"];NSNumber*at = [aDecoder decodeObjectForKey:@"age"];self.age = at.intValue ;NSNumber*isgay = [aDecoder decodeObjectForKey:@"gay"];self.gay = isgay.intValue;? ? }returnself;}/**
*? 將對象寫入文件的時候調(diào)用
*? 怎樣存儲
*
*? @param aCoder aCoder
*/-(void)encodeWithCoder:(NSCoder*)aCoder{? ? [aCoder encodeObject:self.name forKey:@"name"];? ? [aCoder encodeObject:[NSNumbernumberWithInt:self.age] forKey:@"age"];? ? [aCoder encodeObject:[NSNumbernumberWithInt:self.gay] forKey:@"gay"];}@end
這需要重寫initWithCoder和encodeWithCoder這兩個方法遏考,比較繁瑣,這和Android里面的實現(xiàn)Parcelable差不多蓝谨,要寫一大堆的代碼灌具,不過Android有解決這個問題的方案青团,通過安裝AndroidStudio插件來解決,具體請看AndroidStudio-Parcelable自動生成代碼插件安裝和使用這篇文章咖楣,其實督笆,iOS里面也有相關(guān)的解決方案,而且比Android實現(xiàn)更簡單诱贿,快速和高效娃肿,一句代碼搞定!
MJExtension非常好用但是容易被忽略的功能:不管你的模型屬性有幾百個珠十,只需要加一句宏MJCodingImplementation料扰,就能實現(xiàn)歸檔解檔,不用再編寫惡心的encodeWithCoder:和initWithCoder:了
代碼示例如下焙蹭,Person.h代碼不變晒杈,只需要將Person.m文件內(nèi)容改成下面的就OK了:
#import"Person.h"#import"MJExtension.h"@implementationPersonMJCodingImplementation@end
搞定,其實歸檔和反歸檔代碼本質(zhì)上都要寫壳嚎,只不過MJExtension幫我們做了桐智,我們?nèi)c擊這個MJCodingImplementation去看看,發(fā)現(xiàn)代碼是這樣的:
#import@interfaceNSObject(MJCoding)/**
*? 解碼(從文件中解析對象)
*/- (void)decode:(NSCoder*)decoder;/**
*? 編碼(將對象寫入文件中)
*/- (void)encode:(NSCoder*)encoder;@end/**
歸檔的實現(xiàn)
*/#define MJCodingImplementation \- (id)initWithCoder:(NSCoder*)decoder \{ \if(self= [superinit]) { \[selfdecode:decoder]; \} \returnself; \} \\- (void)encodeWithCoder:(NSCoder*)encoder \{ \[selfencode:encoder]; \}
再看實現(xiàn)類代碼
#import"NSObject+MJCoding.h"#import"NSObject+MJMember.h"@implementationNSObject(MJCoding)/**
*? 編碼(將對象寫入文件中)
*/- (void)encode:(NSCoder*)encoder{? ? [selfenumerateIvarsWithBlock:^(MJIvar *ivar,BOOL*stop) {if(ivar.isSrcClassFromFoundation)return;? ? ? ? [encoder encodeObject:ivar.value forKey:ivar.name];? ? }];}/**
*? 解碼(從文件中解析對象)
*/- (void)decode:(NSCoder*)decoder{? ? [selfenumerateIvarsWithBlock:^(MJIvar *ivar,BOOL*stop) {if(ivar.isSrcClassFromFoundation)return;? ? ? ? ivar.value = [decoder decodeObjectForKey:ivar.name];? ? }];}@end
它其實就幫我們實現(xiàn)了把所有屬性都歸檔和反歸檔的操作烟馅,那么問題來了,加入我不想所有的文件都歸檔然磷,我只想歸檔name和age屬性郑趁,不想歸檔gay屬性,那怎么辦呢姿搜?其實MJExtension已經(jīng)幫我們想好了寡润,只需要調(diào)用一下:
[Person setupIgnoredCodingPropertyNames:^NSArray*{return@[@"gay"];}];
這個方法就可以了!>斯瘛K笪啤!V路荨1涑椤!氮块!
作者:街角仰望
鏈接:http://www.reibang.com/p/7e8af12ab5a4
來源:簡書
著作權(quán)歸作者所有绍载。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處滔蝉。