NSURLConnection同步,异步与SSL

原文地址:http://qzc770707.blog.163.com/blog/static/3408275320105249566560/     

      通常在IPhone里用网络访问会用到NSURLConnection来做url链接请求,下面简单介绍一下:



在头文件中加入该语句:


@interface CoursePJViewController :BaseViewController<UITextViewDelegate,NetAccessDelegate,NSURLConnectionDataDelegate>



1、同步请求
              NSURL *url=[[NSURL alloc]initWithString:urlString];

NSMutableURLRequest  *request=[[NSMutableURLRequest alloc]init];

NSError *err=nil;

NSData *data=[NSURLConnection sendSynchronousRequest:request

   returningResponse:nil 

  error:&err];

if(data==nil)

{

//if([err code])

NSLog(@"Code:%d,domain:%@,localizedDesc:%@",[err code],

  [err domain],[err localizedDescription]);

}

else

{

}

  这种情况,通过一个静态方法,请求request,这种情况下,会一直阻塞,等到返回结果,简单易用


2、异步请求

NSURL *url=[[NSURL alloc]initWithString:urlString];

NSMutableURLRequest  *request=[[NSMutableURLRequest alloc]init];

NSURLConnection *connection = [[NSURLConnection allocinitWithRequest:requestdelegate:self];

[url release];

[request release];

if(connection)

{

        receivedData = [[NSMutableData dataretain];

        NSLog(@"intial done!");

    }

else

{

        NSLog(@"sorry");

    }

通过一个delegate来做数据的下载以及Request的接受等等消息,此处delegate:self,所以需要本类实现一些方法,并且定义receivedData做数据的接受

基本上要实现下面节歌方法


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse*)response 

{

NSLog(@"get the whole response");

    [receivedData setLength:0];

}


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

 {

NSLog(@"get some data");

    [receivedData appendData:data];

}


- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

{

[connection release];

   

}


-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

{

    [connection release];

   

     NSLog(@"Connection failed! Error - %@ %@",  

          [error localizedDescription],  

          [[error userInfoobjectForKey:NSErrorFailingURLStringKey]);

}

基本上这样就搞定了!!!

但是异步模式下带来了一个新的问题,很多情况下,网络请求不在主线程,或者界面等待网络结果,不在主线程的时候,调用线程如果生命周期over,下面这些可能都没有调用到,导致得不到想要得效果,所以需要在NSURLConnection请求后面加点东西来阻塞

while(!finished) {

[[NSRunLoop currentRunLooprunMode:NSDefaultRunLoopMode beforeDate:[NSDatedistantFuture]];

}



在头文件中加入该语句:


@interface CoursePJViewController :BaseViewController<UITextViewDelegate,NetAccessDelegate,NSURLConnectionDataDelegate>

你可能感兴趣的:(NSURLConnection同步,异步与SSL)