温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Foundation框架(6)数据处理对象

发布时间:2020-07-11 09:22:15 来源:网络 阅读:316 作者:ymanmeng123 栏目:移动开发

本部分介绍Foundation框架中用于数据处理的各种对象

包括:

    文件管理对象

    文件操作对象

    数据缓存对象

    JSON序列化工具对象

    XML序列化工具对象


  • 文件管理对象NSFileManager

NSFileManager提供了大量的接口帮助我们管理文件系统,如创建、删除、重命名文件等。

使用单例设计模式,获取唯一对象的方法:

+ (NSFileManager *)defaultManager

文件/文件夹创建:

//创建文件
- (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)contents attributes:(NSDictionary<NSString *,id> *)attributes
//创建目录
- (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary<NSString *,id> *)attributeserror:(NSError * _Nullable *)error
//创建目录
- (BOOL)createDirectoryAtURL:(NSURL *)url withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary<NSString *,id> *)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格式介绍

     纯文本文档、区分大小写、标记之间的数据为字符数据

     有且仅有一个根元素、每个元素必须有开始和结束,属性值需要使用双引号或单引号

    Foundation框架(6)数据处理对象     


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 *) 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);
//    }
}




向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI