20.网络
来源:互联网 发布:升腾消费大数据可信吗 编辑:程序博客网 时间:2024/05/15 06:08
网络
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;
0 0
- 20.网络
- 网络!~
- 网络
- 网络
- 网络
- 网络
- 网络
- 网络
- 网络
- 网络
- 网络
- 网络
- 网络
- 网络
- 网络
- 网络
- 网络
- 网络
- Cocos2dx游戏优化总结
- [Java代码] 分享代码片段:将指定位置的war包加入classpath的classloader实现
- Cocos2dX通过Java服务器向Unity传输数据二
- 看看精彩的世界,使用网络技术
- Huawei 2013 机试题
- 20.网络
- ActiveMQ实现负载均衡+高可用部署方案
- android进程优先级的计算
- Node.js初体验
- VMware Workstation导出的ovf格式虚拟机 不能用VirtualBox导入
- Gradle sync failed: Unable to start the daemon process
- Android之Activity的四种启动模式
- Light烘培原理
- jquery插件学习