MJExtension很強(qiáng)大,幾乎支持現(xiàn)有所有的模型、字典、json數(shù)據(jù)轉(zhuǎn)換,而且效率非常高
以前寫對(duì)象歸檔的時(shí)候,需要讓這個(gè)對(duì)象實(shí)現(xiàn)NSCoding協(xié)議,而且要對(duì)每一個(gè)需要?dú)w檔的屬性做一些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;}/**
*? 將對(duì)象寫入文件的時(shí)候調(diào)用
*? 怎樣存儲(chǔ)
*
*? @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這兩個(gè)方法,比較繁瑣,這和Android里面的實(shí)現(xiàn)Parcelable差不多,要寫一大堆的代碼,不過(guò)Android有解決這個(gè)問(wèn)題的方案,通過(guò)安裝AndroidStudio插件來(lái)解決,具體請(qǐng)看AndroidStudio-Parcelable自動(dòng)生成代碼插件安裝和使用這篇文章,其實(shí),iOS里面也有相關(guān)的解決方案,而且比Android實(shí)現(xiàn)更簡(jiǎn)單,快速和高效,一句代碼搞定!
MJExtension非常好用但是容易被忽略的功能:不管你的模型屬性有幾百個(gè),只需要加一句宏MJCodingImplementation,就能實(shí)現(xiàn)歸檔解檔,不用再編寫惡心的encodeWithCoder:和initWithCoder:了
代碼示例如下,Person.h代碼不變,只需要將Person.m文件內(nèi)容改成下面的就OK了:
#import"Person.h"#import"MJExtension.h"@implementationPersonMJCodingImplementation@end
搞定,其實(shí)歸檔和反歸檔代碼本質(zhì)上都要寫,只不過(guò)MJExtension幫我們做了,我們?nèi)c(diǎn)擊這個(gè)MJCodingImplementation去看看,發(fā)現(xiàn)代碼是這樣的:
#import@interfaceNSObject(MJCoding)/**
*? 解碼(從文件中解析對(duì)象)
*/- (void)decode:(NSCoder*)decoder;/**
*? 編碼(將對(duì)象寫入文件中)
*/- (void)encode:(NSCoder*)encoder;@end/**
歸檔的實(shí)現(xiàn)
*/#define MJCodingImplementation \- (id)initWithCoder:(NSCoder*)decoder \{ \if(self= [superinit]) { \[selfdecode:decoder]; \} \returnself; \} \\- (void)encodeWithCoder:(NSCoder*)encoder \{ \[selfencode:encoder]; \}
再看實(shí)現(xiàn)類代碼
#import"NSObject+MJCoding.h"#import"NSObject+MJMember.h"@implementationNSObject(MJCoding)/**
*? 編碼(將對(duì)象寫入文件中)
*/- (void)encode:(NSCoder*)encoder{? ? [selfenumerateIvarsWithBlock:^(MJIvar *ivar,BOOL*stop) {if(ivar.isSrcClassFromFoundation)return;? ? ? ? [encoder encodeObject:ivar.value forKey:ivar.name];? ? }];}/**
*? 解碼(從文件中解析對(duì)象)
*/- (void)decode:(NSCoder*)decoder{? ? [selfenumerateIvarsWithBlock:^(MJIvar *ivar,BOOL*stop) {if(ivar.isSrcClassFromFoundation)return;? ? ? ? ivar.value = [decoder decodeObjectForKey:ivar.name];? ? }];}@end
它其實(shí)就幫我們實(shí)現(xiàn)了把所有屬性都?xì)w檔和反歸檔的操作,那么問(wèn)題來(lái)了,加入我不想所有的文件都?xì)w檔,我只想歸檔name和age屬性,不想歸檔gay屬性,那怎么辦呢?其實(shí)MJExtension已經(jīng)幫我們想好了,只需要調(diào)用一下:
[Person setupIgnoredCodingPropertyNames:^NSArray*{return@[@"gay"];}];
這個(gè)方法就可以了!!!?。。。?!
作者:街角仰望
鏈接:http://www.itdecent.cn/p/7e8af12ab5a4
來(lái)源:簡(jiǎn)書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。