访问网络的基本流程
- 1、构造NSURL地址
- 2、生成NSURLRequest请求
- 3、通过NSURLConnection发送请求
- 4、通过返回NSURLResponse实例和NSError实例分析结果
- 5、接收返回数据
同步请求与异步请求的比较
- 1、同步请求无法取消,异步请求过程中可以取消
- 2、同步请求无法监听加载进度,异步请求可以监听,
- 3、同步请求在主线程中执行,加载需要时间,会阻塞主线程
同步请求—–示例
//1、构建URL地址
NSURL *url = [NSURL URLWithString:@"网址"];
//2、构建请求NSURLRequest,NSURLRequest:不可变对象,不能动态的添加请求信息
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"GET"];//2.1 设置请求方式,都大写
[request setTimeoutInterval:60];//2.2 设置超时时间
//2.3 设置请求头信息
// [request setAllHTTPHeaderFields:(NSDictionary *)];
// [request setValue:(NSString *) forHTTPHeaderField:(NSString *)];
// [request addValue:(NSString *) forHTTPHeaderField:(NSString *)];
[request setValue:@"gzip" forHTTPHeaderField:@"Acc"];
[request setHTTPBody:data];//2.4 设置请求体
[request setCachePolicy:NSURLRequestReturnCacheDataElseLoad];//2.5 设置缓存策略
//3、构造NSURLConnection
NSHTTPURLResponse *response = nil;
NSError *error = nil;
//发送同步请求
NSData *data = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response
error:&error];
//4、获取数据显示---响应
//将data转为字符串
NSString *jsonStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
_textView.text = jsonStr;
//解析json数据
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingMutableContainers
error:nil];
NSLog(@"数据结果: %@", dic);
//5、获取响应信息
NSInteger statusCode = response.statusCode;
NSDictionary *allHeaderFields = response.allHeaderFields;
NSLog(@"statusCode is %ld", statusCode);
NSLog(@"allHeaderFields is %@", allHeaderFields);
//——————————异步请求方法一:block示例
无法监听数据,也无法监听进度
//1、构建URL
NSURL *url = [NSURL URLWithString:@""];
//2、构建Request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setTimeoutInterval:60];
[request setHTTPMethod:@"POST"];
//添加数据请求—请求体
NSString *parasText = @"cinema_id=1533";
NSData *data = [parasText dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
//3、发送请求
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:request
queue:queue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (connectionError) {
return ;
}
//此时是在多线程中
NSString *jsonStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//回到主线程中刷新UI
dispatch_async(dispatch_get_main_queue(), ^{
_textView.text = jsonStr;
});
}];
异步请求方法一:block示例
无法监听数据,也无法监听进度
//1、构建URL
NSURL *url = [NSURL URLWithString:@""];
//2、构建Request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setTimeoutInterval:60];
[request setHTTPMethod:@"POST"];
//添加数据请求—请求体
NSString *parasText = @"cinema_id=1533";
NSData *data = [parasText dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
//3、发送请求
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:request
queue:queue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (connectionError) {
return ;
}
//此时是在多线程中
NSString *jsonStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//回到主线程中刷新UI
dispatch_async(dispatch_get_main_queue(), ^{
_textView.text = jsonStr;
});
}];
异步请求方法一:delegate示例
//1、构建URL
NSURL *url = [NSURL URLWithString:@""];
//2、构建Request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setTimeoutInterval:60];
[request setHTTPMethod:@"POST"];
//添加数据请求
NSString *parasText = @"cinema_id=1533";
NSData *data = [parasText dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
//3、发送请求
[NSURLConnection connectionWithRequest:request delegate:self];
/*
通信协议:NSURLConnectionDelegate
方法:
1、NSURLConnectionDataDelegate
2、NSURLConnectionDownloadDelegate
子协议
*/
#pragma mark -NSURLConnectionDataDelegate协议方法
//接受到服务器的响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response;
//接受传输的数据,若数据量够大,此方法会被调用多次,数据是分批次传输的,在此方法中拼接:appendData
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
//数据接收完成,在此方法中,把文件写进沙盒里,
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
//请求失败时调用的协议方法
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
//将数据保存进沙盒
//将接收到的数据保存到沙盒里
//路径是绝对路径,stringByAppendingString:拼接路径不要忘记前边+ /
[self.receiveData writeToFile:[NSHomeDirectory() stringByAppendingString:@"/QQMusic.dmg"] atomically:YES];
异步请求方法一:子线程法
开辟一个子线程,在子线程中同步请求,然后回到主线程设置UI
子线程调用的方法最好加到自动释放池中去
@autoreleasepool { }
目录
用 [TOC]
来生成目录: