本部分介紹Foundation框架中用于數(shù)據(jù)處理的各種對象
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站設(shè)計制作、網(wǎng)站設(shè)計、網(wǎng)站頁面設(shè)計、網(wǎng)站優(yōu)化SEO優(yōu)化為一體的專業(yè)網(wǎng)絡(luò)公司,已為成都等多地近百家企業(yè)提供網(wǎng)站建設(shè)服務(wù)。追求良好的瀏覽體驗,以探求精品塑造與理念升華,設(shè)計最適合用戶的網(wǎng)站頁面。 合作只是第一步,服務(wù)才是根本,我們始終堅持講誠信,負責任的原則,為您進行細心、貼心、認真的服務(wù),與眾多客戶在蓬勃發(fā)展的市場環(huán)境中,互促共生。包括:
文件管理對象
文件操作對象
數(shù)據(jù)緩存對象
JSON序列化工具對象
XML序列化工具對象
文件管理對象NSFileManager
NSFileManager提供了大量的接口幫助我們管理文件系統(tǒng),如創(chuàng)建、刪除、重命名文件等。
使用單例設(shè)計模式,獲取唯一對象的方法:
+ (NSFileManager *)defaultManager
文件/文件夾創(chuàng)建:
//創(chuàng)建文件 - (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)contents attributes:(NSDictionary*)attributes //創(chuàng)建目錄 - (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary *)attributeserror:(NSError * _Nullable *)error //創(chuàng)建目錄 - (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還可以進行:
文件權(quán)限的判斷、修改
文件的移動、拷貝
鏈接的創(chuàng)建
文件操作類NSFileHandle
NSFileHandle提供了底層文件操作的封裝,能夠方便對文件進行讀寫操作
打開文件:
+ (instancetype)fileHandleForReadingAtPath:(NSString *)path + (instancetype)fileHandleForWritingAtPath:(NSString *)path + (instancetype)fileHandleForUpdatingAtPath:(NSString *)path ...
關(guān)閉文件:
- (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
數(shù)據(jù)緩存對象NSData
NSData用于描述數(shù)據(jù),也被稱作“緩沖區(qū)對象”
通常從網(wǎng)絡(luò)、文件、設(shè)備獲得數(shù)據(jù)都是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創(chuàng)建的方法,如:
- (instancetype)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding //字符串對象
JSON序列化工具類
什么是JSON?
輕量級的數(shù)據(jù)交換格式,正逐步取代XML,成為網(wǎng)絡(luò)數(shù)據(jù)的通用格式。
基于Javascript的一個子集
易讀性略差,編碼手寫難度大,數(shù)據(jù)量小
JSON的格式說明
對象:{}
{key1:value1, key2:value2, …}的鍵值對形式,可以反序列化為OC中的NSDictionary
數(shù)組:[]
[“hello”, “world”, “neusoft”, …] 可以反序列化的OC的NSArray
提示:JSON數(shù)據(jù)格式與OC中的快捷包裝方法非常類似,JSON同樣支持嵌套
iOS5之前,OC本身是不支持JSON解析的,使用第三方庫進行解析,如:SBJson、JSONKit、TouchJson。
在iOS5開始,使用NSJSONSerialization對Json進行解析。
JSON的解析---反序列化
NSJSONSerialization的類方法用于解析JSON數(shù)據(jù)。
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError * _Nullable *)error
解析的數(shù)據(jù)要求是NSData對象,opt是一個枚舉類型:
NSJSONReadingMutableContainers:外層為可變對象
NSJSONReadingMutableLeaves:葉子節(jié)點為可變對象,如解析后的葉子端的字符串是可變的(和文檔中寫的不一樣,不好用)
NSJSONReadingAllowFragments:允許最外層,可以不是NSArray、NSDictionary,但必須是有效的JSON Fragment,如@”123”。
0:是效率最高的一種方式,生成的都是不可變的對象
JSON的封裝---序列化
NSJSONSerialization的類方法用于封裝JSON數(shù)據(jù)
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError * _Nullable *)error
返回的是JSON格式的數(shù)據(jù),通過NSData對象方法寫入文件或發(fā)送到網(wǎng)絡(luò)中。
XML序列化工具
XML格式介紹
純文本文檔、區(qū)分大小寫、標記之間的數(shù)據(jù)為字符數(shù)據(jù)
有且僅有一個根元素、每個元素必須有開始和結(jié)束,屬性值需要使用雙引號或單引號
XML解析的方法
SAX,即simple API for XML,只能讀不能修改,解析速度快,常用大量數(shù)據(jù)的XML在不同的平臺系統(tǒng)上解析
DOM,即Document Object Model,不僅能讀還能修改,接續(xù)速度慢,適合解析小型文檔。
Cocoa中提供了NSXMLParser解析器類,使用SAX解析方法。
XML解析的過程
實例化NSXMLParser解析器對象,將XML數(shù)據(jù)傳入
定義解析器的代理(控制器或代理類)
解析器解析
通過解析代理方法完成XML數(shù)據(jù)的解析
NSXMLParser的實例方法
- (instancetype) initWithContentsOfURL:(NSURL*) url; - (instancetype) initWithData:(NSData*) data;
NSXMLParser的代理屬性及開始解析的方法
@property(assign) iddelegate; - (BOOL) parse; - (void) abortParsing;
NSXMLParser的代理方法(代理設(shè)計模式見設(shè)計模式部分)
開始解析XML文檔
- (void) parserDidStartDocument:(NSXMLParser*) parser;
開始解析某一個元素(會遍歷整個XML,識別元素節(jié)點名稱)
- (void) parser:(NSXMLParser *) parser didStartElement:(NSString*) elementName namespaceURI:(NSString*) namespaceURI qualifiedName:(NSString*)qualifiedName attributes:(NSDictionary*) attributeDict;
獲得文本節(jié)點中的數(shù)據(jù)(大數(shù)據(jù)會接受多次)
- (void) parser:(NSXMLParser*) parser foundCharacters:(NSString*) string;
結(jié)束某個節(jié)點(應存儲上一個代理方法中獲得數(shù)據(jù))
- (void) parser:(NSXMLParser*) parser didEndElement:(NSString*) elementName namespaceURI:(NSString*) namespaceURI qualifiedName:(NSString*) qName;
解析XML文檔結(jié)束
- (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", @"電話", @"街道", @"城區(qū)", @"城市", @"省份"]; if ( [elementName isEqualToString:@"聯(lián)系人"] ) { _tmpModel = [AMContactModel contactModel]; } else if ( [elementArray containsObject:elementName] ) { _tmpString = [NSMutableString string]; } } #pragma mark - 獲得元素中的數(shù)據(jù) - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { [_tmpString appendString:string]; } #pragma mark - 結(jié)束解析某個元素 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if ( [elementName isEqualToString:@"聯(lián)系人"] ) { [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:@"城區(qū)"] ) { _tmpModel.address.district = _tmpString; } else if ( [elementName isEqualToString:@"城市"] ) { _tmpModel.address.city = _tmpString; } else if ( [elementName isEqualToString:@"省份"] ) { _tmpModel.address.province = _tmpString; } } #pragma mark - 結(jié)束解析 - (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); // } }
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。