您的位置:首页 > 理论基础 > 计算机网络

网络请求分为同步异步

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

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

同步请求: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];
});


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的属性.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: