zoukankan      html  css  js  c++  java
  • ios学习:NSURLConnection 和 Json数据解析

     1 #import <UIKit/UIKit.h>
     2 
     3 @interface TWFXViewController : UIViewController
     4 
     5 @property (retain,nonatomic) NSMutableData *weatherData;
     6 
     7 @property (retain, nonatomic) IBOutlet UILabel *outlet_weatherInfo;
     8 
     9 - (IBAction)btnClick_getWeather:(UIButton *)sender;
    10 
    11 @end
      1 //
      2 //  TWFXViewController.m
      3 //  DemoConnection
      4 //
      5 //  Created by Lion User on 13-1-24.
      6 //  Copyright (c) 2013年 Lion User. All rights reserved.
      7 //
      8 
      9 #import "TWFXViewController.h"
     10 
     11 @interface TWFXViewController ()
     12 
     13 @end
     14 
     15 @implementation TWFXViewController
     16 
     17 - (void)viewDidLoad
     18 {
     19     [super viewDidLoad];
     20     // Do any additional setup after loading the view, typically from a nib.
     21     
     22     //label多行显示
     23     self.outlet_weatherInfo.numberOfLines = 0;
     24     
     25 }
     26 
     27 - (void)didReceiveMemoryWarning
     28 {
     29     [super didReceiveMemoryWarning];
     30     // Dispose of any resources that can be recreated.
     31 }
     32 
     33 - (IBAction)btnClick_getWeather:(UIButton *)sender {
     34     
     35     NSString *strURL = @"http://m.weather.com.cn/data/101180601.html";
     36     
     37     //创建URL
     38     NSURL *url = [[NSURL alloc] initWithString:strURL];
     39     
     40     //根据URL创建 NSURLRequest 请求
     41     NSURLRequest *request = [[NSURLRequest alloc]
     42                            initWithURL:url
     43                            cachePolicy:NSURLRequestReloadIgnoringCacheData
     44                            timeoutInterval:60];
     45     
     46     //参数cachePolicy表示缓存策略,枚举类型,值有以下几种:
     47     //
     48 //    enum
     49 //    {
     50 //        NSURLRequestUseProtocolCachePolicy  = 0  NSURLRequest默认的cache policy,使用Protocol协议定义。是最能保持一致性的协议。
     51 //        NSURLRequestReloadIgnoringCacheData = 1  忽略缓存直接从原始地址下载 = NSURLRequestReloadIgnoringCacheData
     52 //        NSURLRequestReturnCacheDataElseLoad = 2  只有在cache中不存在data时才从原始地址下载
     53 //        NSURLRequestReturnCacheDataDontLoad = 3  只使用cache数据,如果不存在cache,请求失败;用于没有建立网络连接离线模式;
     54 //        NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4,  忽略本地和远程的缓存数据,直接从原始地址下载,与NSURLRequestReloadIgnoringCacheData类似。
     55 //        NSURLRequestReloadRevalidatingCacheData = 5  验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据。
     56 //    };
     57 //    typedef NSUInteger NSURLRequestCachePolicy;
     58 
     59 
     60 
     61     //创建连接,该消息一发送下载会立即开始
     62     //在代理(得了噶个)收到connectionDidFinishLoading:或者didFailWithError:消息之前 可以通过给连接发送一个cancel:消息来中断下载
     63     NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
     64     
     65     [url release];
     66     [request release];
     67     
     68     if (connection)
     69     {
     70         //此时才创建NSMutableData 的实例,是否已晚?下载已经异步开始了
     71         if (!_weatherData) {
     72             
     73             self.weatherData = [NSMutableData data];    
     74         }
     75     }
     76     else
     77     {        
     78         NSLog(@"创建网络连接失败!");
     79     }
     80 
     81 }
     82 
     83 
     84 //当服务器提供了足够客户程序创建NSURLResponse对象的信息时,代理对象会收到
     85 //一个connection:didReceiveResponse:消息,在消息内可以检查NSURLResponse
     86 //对象和确定数据的预期长途,mime类型,文件名以及其他服务器提供的元信息
     87 
     88 //要注意,一个简单的连接也可能会收到多个connection:didReceiveResponse:消息
     89 //当服务器连接重置或者一些罕见的原因(比如多组mime文档),代理都会收到该消息
     90 //这时候应该重置进度指示,丢弃之前接收的数据
     91 
     92 //反正当收到该信息就表示下载开始了(或者是重新开始了),把之前的数据清空即可
     93 -(void)connection:connection didReceiveResponse:(NSURLResponse *)response
     94 {
     95     [self.weatherData setLength:0];
     96     
     97    //int expectedLength = [response expectedContentLength];  该方法可以获取将要下载的信息的大小(字节长度)
     98 }
     99 
    100 
    101 //当下载开始的时候,每当有数据接收,代理会定期收到connection:didReceiveData:消息
    102 //代理应当在实现中储存新接收的数据,下面的例子既是如此
    103 //在下面的方法实现中,可以加入一个进度指示器,提示用户下载进度
    104 -(void)connection:connection didReceiveData:(NSData *)data
    105 {
    106     [self.weatherData appendData:data];
    107     
    108     // [data length]; 表示每次接收的信息的大小(字节长度)
    109 }
    110 
    111 
    112 //当下载的过程中有错误发生的时候,代理会收到一个connection:didFailWithError消息
    113 //消息参数里面的NSError对象提供了具体的错误细节,它也能提供在用户信息字典里面失败的
    114 //url请求(使用NSErrorFailingURLStringKey)
    115 
    116 //当代理接收到连接的connection:didFailWithError消息后,该连接不会再收到任何消息,所以应该release掉
    117 
    118 -(void)connection:connection didFailWithError:(NSError *)error
    119 {
    120     [connection release];
    121     
    122   //  [_weatherData release];
    123     NSLog(@"Connection failed! Error - %@ %@",
    124           [error localizedDescription],
    125           [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
    126 }
    127 
    128 
    129 //最后,如果连接请求成功的下载,代理会接收connectionDidFinishLoading:消息
    130 //该消息之后代理不会再收到其他任何的消息了,在消息的实现中,应该释放掉连接
    131 - (void)connectionDidFinishLoading: (NSURLConnection *) connection
    132 {
    133     //do something with the data
    134 
    135     NSLog(@"succeeded %d byte receive",[self.weatherData length]);
    136     [connection release];
    137     
    138     //调用函数解析下载到的json格式的数据
    139     [self readJsonData];
    140 }
    141 
    142 
    143 //解析下载到的json格式的数据
    144 - (void)readJsonData
    145 {
    146    // NSJSONSerialization提供了将JSON数据转换为Foundation对象(一般都是NSDictionary和NSArray)
    147     //和Foundation对象转换为JSON数据(可以通过调用isValidJSONObject来判断Foundation对象是否可以转换为JSON数据)。
    148     
    149     NSError *error;
    150     NSDictionary *weatherDic = [NSJSONSerialization JSONObjectWithData:self.weatherData
    151                                                                options:NSJSONReadingMutableContainers
    152                                                                  error:&error];
    153     
    154     //option参数说明.
    155 //    enum {
    156 //        NSJSONReadingMutableContainers = (1UL << 0),   //返回的容器是可变类型的(Array和Dictionary)
    157 //        NSJSONReadingMutableLeaves = (1UL << 1),     //返回的叶子NSString是可变类型的;
    158 //        NSJSONReadingAllowFragments = (1UL << 2)   //允许顶层的界面不是NSArray或NSDictionary;
    159 //    };
    160 //    typedef NSUInteger NSJSONReadingOptions;
    161     
    162     NSDictionary *weatherInfo = [weatherDic objectForKey:@"weatherinfo"];
    163     
    164     self.outlet_weatherInfo.text = [NSString stringWithFormat:@"今天是 %@  %@  %@  的天气状况是:%@  %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]];
    165 
    166 }
    167 
    168 -(void) dealloc
    169 {
    170     [_weatherData release];
    171     [_outlet_weatherInfo release];
    172     [super dealloc];
    173 }
    174 
    175 
    176 @end
  • 相关阅读:
    四则运算在线答题dos
    动手动脑11.11
    Java编程中关于异常处理的10个要点
    java第五周课后作业1
    java静态初始化块的执行顺序
    java工程项目作业1
    十一Java作业三
    Linux运维笔记(一)网络基础知识
    分布式笔记(二)一致性协议
    分布式笔记(一)分布式构架概述
  • 原文地址:https://www.cnblogs.com/zouzf/p/2877279.html
Copyright © 2011-2022 走看看