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