在ios7 以前使用 NSURLConnect发起网络请求,在ios7之后使用NSURLSession发起网络请求。
发起网络请求分三个部分:
一、设置NSURL
二、设置NSURLRequest
三、发起网络请求 NSURLConnect NSURLMutableConnect
相应返回的方式有两种 block、delegate
下面的.m文件使用delegate监控网络交互
//
// ViewController.m
// URLConnectDemo
//
#import "ViewController.h"
@interface ViewController ()<NSURLConnectionDelegate,NSURLConnectionDataDelegate>
{
NSMutableData *receiveData;
NSURLConnection *theConnection;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 1、先创建一个NSURL
// 2、再通过NSURL创建NSURLRequest,可以指定缓存规则和超时时间
// 3、创建NSURLConnection实例,指定NSURLRequest和一个delegate对象
// 如果创建失败,则会返回nil,如果创建成功则创建一个NSMutalbeData的实例用来存储数据
NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
//当收到initWithRequest: delegate: 消息时,下载会立即开始,在代理(delegate)
theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if(theConnection){
//创建NSMutableData
receiveData = [NSMutableData data];
}else{
//创建失败
}
}
//【要注意】,一个简单的连接也可能会收到多个connection:didReceiveResponse:消息当服务器连接重置或者一些罕见的原因(比如多组mime文档),代理都会收到该消息这时候应该重置进度指示,丢弃之前接收的数据
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
[receiveData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[receiveData appendData:data];
}
//当代理接收到连接的connection:didFailWithError消息后,对于该连接不会在收到任何消息
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
theConnection = nil;
NSLog(@"Connection failed! Error - %@ %@",[error localizedDescription],[[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
}
//数据下载完毕,最后,如果连接请求成功的下载,代理会接收connectionDidFinishLoading:消息代理不会收到其他的消息了,在消息的实现中,应该释放掉连接
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSString *s = [[NSString alloc] initWithData:receiveData encoding:NSUTF8StringEncoding];
NSLog(@"succeeded %@",s);
theConnection = nil;
[receiveData setLength:0];
}
@end