Foundation框架(6)数据处理对象
本部分介绍Foundation框架中用于数据处理的各种对象
包括:
文件管理对象
文件操作对象
数据缓存对象
JSON序列化工具对象
XML序列化工具对象
文件管理对象NSFileManager
NSFileManager提供了大量的接口帮助我们管理文件系统,如创建、删除、重命名文件等。
使用单例设计模式,获取唯一对象的方法:
+(NSFileManager*)defaultManager
文件/文件夹创建:
//创建文件-(BOOL)createFileAtPath:(NSString*)pathcontents:(NSData*)contentsattributes:(NSDictionary<NSString*,id>*)attributes//创建目录-(BOOL)createDirectoryAtPath:(NSString*)pathwithIntermediateDirectories:(BOOL)createIntermediatesattributes:(NSDictionary<NSString*,id>*)attributeserror:(NSError*_Nullable*)error//创建目录-(BOOL)createDirectoryAtURL:(NSURL*)urlwithIntermediateDirectories:(BOOL)createIntermediatesattributes:(NSDictionary<NSString*,id>*)attributeserror:(NSError*_Nullable*)error
删除:
-(BOOL)removeItemAtURL:(NSURL*)URLerror:(NSError*_Nullable*)error-(BOOL)removeItemAtPath:(NSString*)patherror:(NSError*_Nullable*)error
存在性判断:
-(BOOL)fileExistsAtPath:(NSString*)path-(BOOL)fileExistsAtPath:(NSString*)pathisDirectory:(BOOL*)isDirectory
NSFileManager还可以进行:
文件权限的判断、修改
文件的移动、拷贝
链接的创建
文件操作类NSFileHandle
NSFileHandle提供了底层文件操作的封装,能够方便对文件进行读写操作
打开文件:
+(instancetype)fileHandleForReadingAtPath:(NSString*)path+(instancetype)fileHandleForWritingAtPath:(NSString*)path+(instancetype)fileHandleForUpdatingAtPath:(NSString*)path...
关闭文件:
-(void)closeFile
读写:
-(NSData*)readDataOfLength:(NSUInteger)length-(NSData*)readDataToEndOfFile-(void)writeData:(NSData*)data
偏移量定位:
-(void)seekToFileOffset:(unsignedlonglong)offset-(unsignedlonglong)seekToEndOfFile@property(readonly)unsignedlonglongoffsetInFile
数据缓存对象NSData
NSData用于描述数据,也被称作“缓冲区对象”
通常从网络、文件、设备获得数据都是NSData类型的
+(instancetype)dataWithContentsOfFile:(NSString*)path+(instancetype)dataWithContentsOfURL:(NSURL*)aURL+(instancetype)dataWithBytes:(constvoid*)byteslength:(NSUInteger)length
常用操作:
@property(readonly)NSUIntegerlength-(BOOL)writeToFile:(NSString*)pathatomically:(BOOL)atomically-(BOOL)writeToURL:(NSURL*)aURLatomically:(BOOL)atomically
Foundation框架中的很多其他类,都提供了由NSData创建的方法,如:
-(instancetype)initWithData:(NSData*)dataencoding:(NSStringEncoding)encoding//字符串对象
JSON序列化工具类
什么是JSON?
轻量级的数据交换格式,正逐步取代XML,成为网络数据的通用格式。
基于Javascript的一个子集
易读性略差,编码手写难度大,数据量小
JSON的格式说明
对象:{}
{key1:value1, key2:value2, …}的键值对形式,可以反序列化为OC中的NSDictionary
数组:[]
[“hello”, “world”, “neusoft”, …] 可以反序列化的OC的NSArray
提示:JSON数据格式与OC中的快捷包装方法非常类似,JSON同样支持嵌套
iOS5之前,OC本身是不支持JSON解析的,使用第三方库进行解析,如:SBJson、JSONKit、TouchJson。
在iOS5开始,使用NSJSONSerialization对Json进行解析。
JSON的解析---反序列化
NSJSONSerialization的类方法用于解析JSON数据。
+(id)JSONObjectWithData:(NSData*)dataoptions:(NSJSONReadingOptions)opterror:(NSError*_Nullable*)error
解析的数据要求是NSData对象,opt是一个枚举类型:
NSJSONReadingMutableContainers:外层为可变对象
NSJSONReadingMutableLeaves:叶子节点为可变对象,如解析后的叶子端的字符串是可变的(和文档中写的不一样,不好用)
NSJSONReadingAllowFragments:允许最外层,可以不是NSArray、NSDictionary,但必须是有效的JSON Fragment,如@”123”。
0:是效率最高的一种方式,生成的都是不可变的对象
JSON的封装---序列化
NSJSONSerialization的类方法用于封装JSON数据
+(NSData*)dataWithJSONObject:(id)objoptions:(NSJSONWritingOptions)opterror:(NSError*_Nullable*)error
返回的是JSON格式的数据,通过NSData对象方法写入文件或发送到网络中。
XML序列化工具
XML格式介绍
纯文本文档、区分大小写、标记之间的数据为字符数据
有且仅有一个根元素、每个元素必须有开始和结束,属性值需要使用双引号或单引号
XML解析的方法
SAX,即simple API for XML,只能读不能修改,解析速度快,常用大量数据的XML在不同的平台系统上解析
DOM,即Document Object Model,不仅能读还能修改,接续速度慢,适合解析小型文档。
Cocoa中提供了NSXMLParser解析器类,使用SAX解析方法。
XML解析的过程
实例化NSXMLParser解析器对象,将XML数据传入
定义解析器的代理(控制器或代理类)
解析器解析
通过解析代理方法完成XML数据的解析
NSXMLParser的实例方法
-(instancetype)initWithContentsOfURL:(NSURL*)url;-(instancetype)initWithData:(NSData*)data;
NSXMLParser的代理属性及开始解析的方法
@property(assign)id<NSXMLParserDelegate>delegate;-(BOOL)parse;-(void)abortParsing;
NSXMLParser的代理方法(代理设计模式见设计模式部分)
开始解析XML文档
-(void)parserDidStartDocument:(NSXMLParser*)parser;
开始解析某一个元素(会遍历整个XML,识别元素节点名称)
-(void)parser:(NSXMLParser*)parserdidStartElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qualifiedNameattributes:(NSDictionary*)attributeDict;
获得文本节点中的数据(大数据会接受多次)
-(void)parser:(NSXMLParser*)parserfoundCharacters:(NSString*)string;
结束某个节点(应存储上一个代理方法中获得数据)
-(void)parser:(NSXMLParser*)parserdidEndElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qName;
解析XML文档结束
-(void)parserDidEndDocument:(NSXMLParser*)parser;
解析出错时
-(void)parser:(NSXMLParser*)parserparseErrorOccurred:(NSError*)parseError;
如:
#pragmamark-开始解析-(void)parserDidStartDocument:(NSXMLParser*)parser{if(self.contactArray==nil){self.contactArray=[NSMutableArrayarray];}else{[self.contactArrayremoveAllObjects];}}#pragmamark-开始解析某个元素-(void)parser:(NSXMLParser*)parserdidStartElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qNameattributes:(NSDictionary*)attributeDict{NSArray*elementArray=@[@"姓名",@"ID",@"公司",@"EMAIL",@"电话",@"街道",@"城区",@"城市",@"省份"];if([elementNameisEqualToString:@"联系人"]){_tmpModel=[AMContactModelcontactModel];}elseif([elementArraycontainsObject:elementName]){_tmpString=[NSMutableStringstring];}}#pragmamark-获得元素中的数据-(void)parser:(NSXMLParser*)parserfoundCharacters:(NSString*)string{[_tmpStringappendString:string];}#pragmamark-结束解析某个元素-(void)parser:(NSXMLParser*)parserdidEndElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qName{if([elementNameisEqualToString:@"联系人"]){[self.contactArrayaddObject:_tmpModel];_tmpModel=nil;}elseif([elementNameisEqualToString:@"姓名"]){_tmpModel.name=_tmpString;}elseif([elementNameisEqualToString:@"ID"]){_tmpModel.ID=_tmpString;}elseif([elementNameisEqualToString:@"公司"]){_tmpModel.company=_tmpString;}elseif([elementNameisEqualToString:@"EMAIL"]){_tmpModel.email=_tmpString;}elseif([elementNameisEqualToString:@"电话"]){_tmpModel.tel=_tmpString;}elseif([elementNameisEqualToString:@"街道"]){_tmpModel.address.street=_tmpString;}elseif([elementNameisEqualToString:@"城区"]){_tmpModel.address.district=_tmpString;}elseif([elementNameisEqualToString:@"城市"]){_tmpModel.address.city=_tmpString;}elseif([elementNameisEqualToString:@"省份"]){_tmpModel.address.province=_tmpString;}}#pragmamark-结束解析-(void)parserDidEndDocument:(NSXMLParser*)parser{if(self.delegate&&[self.delegaterespondsToSelector:@selector(contactXMLController:parserFinishWithArray:)]){[self.delegatecontactXMLController:selfparserFinishWithArray:self.contactArray];}//for(AMContactModel*modelinself.contactArray){//NSLog(@"%@",model);//}}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。