20.网络
2016-03-19 09:35
686 查看
网络
HTTP请求
GET请求NSString *urlStr = @"http://xxxxx.com"; urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:urlStr]; // 请求 NSURLRequest *request = [NSURLRequest requestWithURL:url];
POST请求
NSString *urlStr = @"http://xxxxx.com"; urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:urlStr]; // 请求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.HTTPMethod = @"POST"; request.HTTPBody = [@"username=123&pwd=123" dataUsingEncoding:NSUTF8StringEncoding];
数据解析
JSONNSJSONSerialization
XML
SAX: NSXMLParser
DOM: GDataXML
NSURLConnection(iOS9已经过期)
发送同步请求
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error; // 这个方法是阻塞式的,会在当前线程发送请求 // 当服务器的数据完全返回时,这个方法才会返回,代码才会继续往下执行
发送异步请求-block
+ (void)sendAsynchronousRequest:(NSURLRequest*) request queue:(NSOperationQueue*) queue completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler; // 会自动开启一个子线程去发送请求 // 当请求完毕(成功\失败),会自动调用handler这个block // handler这个block会放到queue这个队列中执行
发送异步请求-delegate
创建NSURLConnection对象// startImmediately==YES,创建完毕后,自动发送异步请求 - (instancetype)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately; - (instancetype)initWithRequest:(NSURLRequest *)request delegate:(id)delegate; // 创建完毕后,自动发送异步请求 + (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate; // 创建完毕后,自动发送异步请求
发送请求
[connection start];
遵守
NSURLConnectionDataDelegate协议,实现协议中的代理方法
// 当接收到服务器的响应时就会调用 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; // 每当接收到服务器返回的数据时就会调用1次(数据量大的时候,这个方法就会被调用多次) - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; // 当服务器的数据完全返回时调用(服务器的数据接收完毕) - (void)connectionDidFinishLoading:(NSURLConnection *)connection; // 当请求失败的时候调用 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
取消请求
[connection cancel];
NSString和NSData的互相转换
NSString -> NSDataNSData *data = [@"qweq" dataUsingEncoding:NSUTF8StringEncoding];
NSData -> NSString
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
字典转模型框架
Mantle所有模型都必须继承自MTModel
JSONModel
所有模型都必须继承自JSONModel
MJExtension
不需要强制继承任何其他类
设计框架需要考虑的问题
侵入性侵入性大就意味着很难离开这个框架
易用性
比如少量代码实现N多功能
扩展性
很容易给这个框架增加新框架
JSON的解析方式
在iOS中,JSON的常见解析方案有4种第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右,越差)
苹果原生(自带):NSJSONSerialization(性能最好)
NSJSONSerialization的常见方法
JSON数据 > OC对象
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error
OC对象 > JSON数据
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error
XML的解析方式
XML的解析方式有2种DOM:一次性将整个XML文档加载进内存,比较适合解析小文件
SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件
在iOS中,解析XML的手段有很多
苹果原生 NSXMLParser:SAX方式解析,使用简单
第三方框架
libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析
GDataXML:DOM方式解析,由Google开发,基于libxml2
XML解析方式的选择建议
大文件:NSXMLParser、libxml2
小文件:GDataXML、NSXMLParser、libxml2
NSXMLParser的用法
创建解析器来解析
// 创建XML解析器 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; // 设置代理 parser.delegate = self; // 开始解析XML(parse方法是阻塞式的) [parser parse];
代理对象要遵守NSXMLParserDelegate协议,实现代理方法
NSXMLParser采取的是SAX方式解析,特点是事件驱动,下面情况都会通知代理
当扫描到文档(Document)的开始与结束
当扫描到元素(Element)的开始与结束
//解析到某个元素的开头(比如解析<videos>) - (void)parser:(NSXMLParser *)parser didStartElement: (NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { } //解析到某个元素的结尾(比如解析</videos>) - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {} //开始解析XML文档 - (void)parserDidStartDocument:(NSXMLParser *)parser {} //解析完毕 - (void)parserDidEndDocument:(NSXMLParser *)parser{}
GDataXML的使用
配置
GDataXML基于libxml2库,得做以下配置
导入libxml2库
设置libxml2的头文件搜索路径(为了能找到libxml2库的所有头文件)
在Head Search Path中加入/usr/include/libxml2
设置链接参数(自动链接libxml2库)
在Other Linker Flags中加入-lxml2
由于GDataXML是非ARC的,因此得设置编译参数
具体用法
// 加载整个文档 GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil]; // 获得根节点 doc.rootElement; // 获得其他节点 [element elementsForName:@"video"]; // 获得节点的属性 [element attributeForName:@"name"].stringValue;