网络
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];
数据解析
- JSON
- NSJSONSerialization
- 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 -> NSData
NSData *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的,因此得设置编译参数
- 导入libxml2库
- 具体用法
// 加载整个文档 GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil]; // 获得根节点 doc.rootElement; // 获得其他节点 [element elementsForName:@"video"]; // 获得节点的属性 [element attributeForName:@"name"].stringValue;