扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本部分介绍Foundation框架中用于数据处理的各种对象
目前创新互联建站已为近1000家的企业提供了网站建设、域名、虚拟空间、绵阳服务器托管、企业网站设计、城关网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
包括:
文件管理对象
文件操作对象
数据缓存对象
JSON序列化工具对象
XML序列化工具对象
文件管理对象NSFileManager
NSFileManager提供了大量的接口帮助我们管理文件系统,如创建、删除、重命名文件等。
使用单例设计模式,获取唯一对象的方法:
+ (NSFileManager *)defaultManager
文件/文件夹创建:
//创建文件 - (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)contents attributes:(NSDictionary*)attributes //创建目录 - (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary *)attributeserror:(NSError * _Nullable *)error //创建目录 - (BOOL)createDirectoryAtURL:(NSURL *)url withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary *)attributeserror:(NSError * _Nullable *)error
删除:
- (BOOL)removeItemAtURL:(NSURL *)URL error:(NSError * _Nullable *)error - (BOOL)removeItemAtPath:(NSString *)path error:(NSError * _Nullable *)error
存在性判断:
- (BOOL)fileExistsAtPath:(NSString *)path - (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(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:(unsigned long long)offset - (unsigned long long)seekToEndOfFile @property(readonly) unsigned long long offsetInFile
数据缓存对象NSData
NSData用于描述数据,也被称作“缓冲区对象”
通常从网络、文件、设备获得数据都是NSData类型的
+ (instancetype)dataWithContentsOfFile:(NSString *)path + (instancetype)dataWithContentsOfURL:(NSURL *)aURL + (instancetype)dataWithBytes:(const void *)bytes length:(NSUInteger)length
常用操作:
@property(readonly) NSUInteger length - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)atomically - (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)atomically
Foundation框架中的很多其他类,都提供了由NSData创建的方法,如:
- (instancetype)initWithData:(NSData *)data encoding:(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 *)data options:(NSJSONReadingOptions)opt error:(NSError * _Nullable *)error
解析的数据要求是NSData对象,opt是一个枚举类型:
NSJSONReadingMutableContainers:外层为可变对象
NSJSONReadingMutableLeaves:叶子节点为可变对象,如解析后的叶子端的字符串是可变的(和文档中写的不一样,不好用)
NSJSONReadingAllowFragments:允许最外层,可以不是NSArray、NSDictionary,但必须是有效的JSON Fragment,如@”123”。
0:是效率最高的一种方式,生成的都是不可变的对象
JSON的封装---序列化
NSJSONSerialization的类方法用于封装JSON数据
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(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) iddelegate; - (BOOL) parse; - (void) abortParsing;
NSXMLParser的代理方法(代理设计模式见设计模式部分)
开始解析XML文档
- (void) parserDidStartDocument:(NSXMLParser*) parser;
开始解析某一个元素(会遍历整个XML,识别元素节点名称)
- (void) parser:(NSXMLParser *) parser didStartElement:(NSString*) elementName namespaceURI:(NSString*) namespaceURI qualifiedName:(NSString*)qualifiedName attributes:(NSDictionary*) attributeDict;
获得文本节点中的数据(大数据会接受多次)
- (void) parser:(NSXMLParser*) parser foundCharacters:(NSString*) string;
结束某个节点(应存储上一个代理方法中获得数据)
- (void) parser:(NSXMLParser*) parser didEndElement:(NSString*) elementName namespaceURI:(NSString*) namespaceURI qualifiedName:(NSString*) qName;
解析XML文档结束
- (void) parserDidEndDocument:(NSXMLParser *) parser;
解析出错时
- (void) parser:(NSXMLParser*) parser parseErrorOccurred:(NSError*) parseError;
如:
#pragma mark - 开始解析 - (void)parserDidStartDocument:(NSXMLParser *)parser { if ( self.contactArray == nil ) { self.contactArray = [NSMutableArray array]; } else { [self.contactArray removeAllObjects]; } } #pragma mark - 开始解析某个元素 - (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { NSArray * elementArray = @[@"姓名", @"ID", @"公司", @"EMAIL", @"电话", @"街道", @"城区", @"城市", @"省份"]; if ( [elementName isEqualToString:@"联系人"] ) { _tmpModel = [AMContactModel contactModel]; } else if ( [elementArray containsObject:elementName] ) { _tmpString = [NSMutableString string]; } } #pragma mark - 获得元素中的数据 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { [_tmpString appendString:string]; } #pragma mark - 结束解析某个元素 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if ( [elementName isEqualToString:@"联系人"] ) { [self.contactArray addObject:_tmpModel]; _tmpModel = nil; } else if ( [elementName isEqualToString:@"姓名"] ) { _tmpModel.name = _tmpString; } else if ( [elementName isEqualToString:@"ID"] ) { _tmpModel.ID = _tmpString; } else if ( [elementName isEqualToString:@"公司"] ) { _tmpModel.company = _tmpString; } else if ( [elementName isEqualToString:@"EMAIL"] ) { _tmpModel.email = _tmpString; } else if ( [elementName isEqualToString:@"电话"] ) { _tmpModel.tel = _tmpString; } else if ( [elementName isEqualToString:@"街道"] ) { _tmpModel.address.street = _tmpString; } else if ( [elementName isEqualToString:@"城区"] ) { _tmpModel.address.district = _tmpString; } else if ( [elementName isEqualToString:@"城市"] ) { _tmpModel.address.city = _tmpString; } else if ( [elementName isEqualToString:@"省份"] ) { _tmpModel.address.province = _tmpString; } } #pragma mark - 结束解析 - (void)parserDidEndDocument:(NSXMLParser *)parser { if ( self.delegate && [self.delegate respondsToSelector:@selector(contactXMLController:parserFinishWithArray:)] ) { [self.delegate contactXMLController:self parserFinishWithArray:self.contactArray]; } // for ( AMContactModel * model in self.contactArray ) { // NSLog(@"%@", model); // } }
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流