/********访问网络同步请求、异步请求基本概念********/
// 访问网络的基本概念
访问网络方式:
同步请求 : 主线程执行 , 请求无法取消, 无法坚挺加载进度
异步请求 : 多线程执行 , 请求可以取消, 可以监听
// 访问网络的基本流程:(简略说明)
构造NSURL实例(地址)
生成NSURLRequest请求
通过NSURLConnection发送请求
通过返回NSURLRespond实例和NSError实例分析结果
接受返回数据
// NSURL释义与常用方法
NSURL实例包装了一个地址信息,可以是本地地址,也可以是远程地址
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com:8080/search?id=1"];
/********NSURLRequest的使用********/
// NSURLRequest的使用
NSURLRequest包装了网络请求的信息。
NSURLRequest *request = [NSURLRequest requestWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60];
NSURLRequestUseProtocolCachePolicy参考-> //
http://www.cnblogs.com/pengyingh/articles/2343083.html
// NSMutableRequest的使用
相对于NSRequest,可以对请求信息重新设置
示例:
NSMutableRequest *request [[NSMutableRequest alloc]init];
[request setURL:url];
// 设置请求方式get/post
[request setHTTPMethod:@"POST"];
// 设置超时时间
[request setTimeoutInterval:60];
// 设置请求参数
[request setHTTPBody:_data];
// 设置请求头
[request setValue:@"tttt" forHTTPHeaderField:@"cookes"];
/********同步请求用法********/
//构造url
NSURL *url = [NSURL URLWithString:@"http://www.iphonetrain.com"];
//创建一个请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//响应
NSURLResponse *response;
//发送同步请求,请求成功后返回数据
NSData *resultData = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response
error:nil];
// -------data转化为string------
NSString *dataString = [[NSString alloc]initWithData:resultData
encoding:NSUTF8StringEncoding];
/********异步请求用法********/
// 第一种方式(代理方式)
//发送异步请求
[NSURLConnection connectionWithRequest:request delegate:self];
//delegate 接受加载的数据
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[_data appendData:data];
}
//delegate 数据加载完后调用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSString *dataString = [[NSString alloc]initWithData:_data
encoding:NSUTF8StringEncoding];
}
// 第二种方式(开辟一个子线程,结合创建多线程的多种方式)
//启动一个新的线程加载数据
[self performSelectorInBackground:@selector(loadData) withObject:nil];
//loadData发送同步请求(发送一个普通的请求)
- (void)loadData {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
NSURL *url = [NSURL URLWithString:request_url];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//发送同步请求,获取数据data
NSData *data = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response
error:nil];
//回到主线程调用方法
[self performSelectorOnMainThread:@selector(afterLoadData)
withObject:stringData
waitUntiDone:NO]; // 直到子线程任务完成
[pool release];
}
/********取消异步请求********/
//发送cancel取消请求,同步请求无法取消。
//取消请求后,网络请求会按失败处理,会调用失败的代理
[request cancel];