NSURLConnection-网络访问(同步异步)

/********访问网络同步请求、异步请求基本概念********/
//  访问网络的基本概念
访问网络方式:
同步请求 : 主线程执行 , 请求无法取消, 无法坚挺加载进度
异步请求 : 多线程执行 , 请求可以取消, 可以监听

//  访问网络的基本流程:(简略说明)
构造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];

 

posted @ 2013-11-01 10:06  needly  阅读(693)  评论(0编辑  收藏  举报