同步和异步的区别:同步请求需要主线程进行数据请求,在数据没回来之前其他的操作都会被阻塞,造成程序的卡顿现象.
异步请求是主线程找了一个子线程(小弟)去进行网络数据请求,因此对于其他的界面操作主线程还可以做,不会有程序卡顿现象的出现.因此网络请求时我们选择使用异步请求.
同步请求:1>将链接中的汉字转换成UTF-8编码 2>将网址链接转换成真正的URL(NSURL--网址类)3>创建网络请求对象 4>进行网络同步请求 5>网络数据解析 6>数据封装 7>重新载入数据
Get方法的异步请求
宏定义网址
#define URLSTR @"http://api.map.baidu.com/place/v2/search?query=麦当劳®ion=郑州&output=json&ak=6E823f587c95f0148c19993539b99295"
1 将链接中的汉字转换成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];
});
首先定义一个属性,存储 链接对象,防止程序一直请求数据,崩溃.
//创建链接对象
@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的属性.