博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

HTTP NSURLConnection

Posted on 2011-06-27 21:48  星尘的天空  阅读(592)  评论(0编辑  收藏  举报

LINK URL: http://qzc770707.blog.163.com/blog/static/3408275320105249566560/

通常在iPhone里用NSURLConnection做url请求

1.NSURLConnection同步与异步请求
(1)异步请求:
NSMutableData* buf = [[NSMutableData alloc] initWithLength:0];
NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:req delegate:self];
 
// 收到响应时, 会触发
- (void)connection:(NSURLConnection *)aConnection didReceiveResponse:(NSURLResponse *)aResponse;
// 可以在里面判断返回结果, 或者处理返回的http头中的信息
 
// 每收到一次数据, 会调用一次
- (void)connection:(NSURLConnection *)aConn didReceiveData:(NSData *)data;
// 因此一般来说,是
- (void)connection:(NSURLConnection *)aConn didReceiveData:(NSData *)data
{
    [buf appendData:data];
}
// buffer就是前面initWithRequest时同时声明的.
 
// 网络错误时触发
- (void)connection:(NSURLConnection *)aConn didFailWithError:(NSError *)error;
 
// 全部数据接收完毕时触发
- (void)connectionDidFinishLoading:(NSURLConnection *)aConn;


(2)同步请求:
/ 初始化請求
        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];         
// 設置URL
        [request setURL:[NSURL URLWithString:urlStr]];
// 設置HTTP方法
        [request setHTTPMethod:@"GET"];
// 發送同步請求, 這裡得returnData就是返回得數據楽
        NSData *returnData = [NSURLConnection sendSynchronousRequest:request 
                                                   returningResponse:nil error:nil]; 
// 釋放對象
        [request release];

2. 注意head请求,如果在head响应中继续请求下一个地址,之后的响应和前一个响应对象的指针地址一样,内容也一样。改为了get请求,解决此问题。还没有更彻底的解决办法。

   另外设置setCachePolicy不起作用。

3.ASIHTTPRequest.

   ASIHTTPRequest不是直接使用的NSURLConnection.

   http://www.cnblogs.com/chen1987lei/archive/2011/06/07/2074636.html

   http://blog.csdn.net/kmyhy/archive/2011/06/03/6524916.aspx

   http://allseeing-i.com/

   队列异步请求中中获取或识别不同request小技巧 
a,可以设置一个上下文(userInfo)到request对象中,当请求响应完后可以通过访问request对象的userInfo获取里面的信息
b,为每一个请求实例设置不同的setDidFinishSelector / setDidFailSelector的回调方法
c,子类化ASIHTTPRequest,重写requestFinished: 与 failWithProblem:方法

   安全的内存回收建议 
request并没有retain delegate,所以若在没有请求完时候释放此delegate,需要在dealloc方法里先取消所有请求,再释放请求实例,如- (void)dealloc{ [request clearDelegatesAndCancel]; [request release]; ...[super dealloc];}