网络请求分为同步异步

同步和异步的区别:同步请求需要主线程进行数据请求,在数据没回来之前其他的操作都会被阻塞,造成程序的卡顿现象.

异步请求是主线程找了一个子线程(小弟)去进行网络数据请求,因此对于其他的界面操作主线程还可以做,不会有程序卡顿现象的出现.因此网络请求时我们选择使用异步请求.


同步请求:1>将链接中的汉字转换成UTF-8编码   2>将网址链接转换成真正的URL(NSURL--网址类)3>创建网络请求对象   4>进行网络同步请求  5>网络数据解析   6>数据封装   7>重新载入数据

Get方法的异步请求 
宏定义网址  
#define URLSTR @"http://api.map.baidu.com/place/v2/search?query=麦当劳&region=郑州&output=json&ak=6E823f587c95f0148c19993539b99295"

将链接中的汉字转换成UTF-8编码

    NSString *urlStr = [URLSTR stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];//这个是直接对象用的方法 所以不用alloc  init

2将网址链接转换成真正的URL(NSURL---网址类)

    NSURL *url = [NSURL URLWithString:urlStr];

3 根据网址 创建网络请求对象

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

4  block进行网络连接异步请求(一定要想到网络连接)

    NSURLConnection sendAsynchronousRequest:<#(NSURLRequest *)#> queue:<#(NSOperationQueue *)#> completionHandler:<#^(NSURLResponse *response, NSData *data, NSError *connectionError)handler#>
根据参数知道  我们需要一个队列 所以记得初始化一个队列.

在block里面进行数据解析和数据封装以及数据刷新(异步的刷新必须是主线程完成).
      dispatch_async(dispatch_get_main_queue(), ^{
          [self.tableView reloadData];
      });

4 代理完成数据请求
首先定义一个属性,存储 链接对象,防止程序一直请求数据,崩溃.
//创建链接对象
@property(nonatomic,retain)NSURLConnection *connection;
然后在进行数据请求的时候,如果连接对象存在,就清空
  if (self.connection != nil) {
        //停止之前的网络数据请求
        [self.connection cancel];
    }
   self.connection = [NSURLConnection connectionWithRequest:request delegate:self];

三种代理方法:
//当接受到服务器回应的时候调用:这时候创建NSMutableData对象,目的是在下面接受到数据的时候存东西
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    self.contentData = [NSMutableData dataWithCapacity:0];
}

//当接受到数据的时候调用.由于数据是以片段的形式返回,因此该方法会被反复调用多次.
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    //将接受到的数据拼接起来
    [self.contentData appendData:data];
}

//数据接受完毕的时候调用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
     //解析数据
    NSMutableDictionary     *dataDic =[NSJSONSerialization JSONObjectWithData:self.contentData options: NSJSONReadingMutableContainers  error:nil];
    //封装数据
    [self dealDataFormNetWork:dataDic];
    
    [self.tableView reloadData];
}



  [lifemodel setValuesForKeysWithDictionary:resultDic]; //封装model的一个神器

如果字典resultDic有和lifemodel属性一样的键,则直接将值赋值给lifemodel的属性.
相关文章
相关标签/搜索