网络,json,xml
通过NSURLConnection实现网络数据下载
通过NSURLConnection这个类来创建一个异步的请求
NSURLconnection提供了两种方式来实现链接,一种是同步的,另一种是异步的。异步的链接将会创建一个新的线程,这个线程将会来负责下载的动作。同步的链接将会堵塞当前线程,也就是说会造成当前的主线程堵塞,直到这个同步的线程运行完毕将会继续运行主线程。
同步和异步的主要区别就是运行的时候是否会创建一个新的现成,异步的会穿啊构建一个新的,而同步的并不会。
为了能够创建一个异步的请求连接,我们需要做如下操作:
1.创建一个NSString类型的URL链接字符串
2.把NSString类型转化成网络可识别的NSURL类型。
3.把我们的URL对象赋值到NSURLRequest对象中,如果是多个连接请求,请使用NSMutableURLRequest。
4.创建一个NSURLConnection的链接实例,然后把我们定义好的URL对象赋值过去。
我们可以创建一个异步的URL连接对象通过 sendAsynchronousRequest:queue:completionHandler 这个方法
这个方法参数如下:
sendAsynchronousRequest 一个NSURLRequest类型请求。
Queue 一个操作队列,wo我们可以很轻松的分配和初始化一个操作队列,然后可以根据我们需求添加到这个方法的参数中。
completionHandler 一个临时堵塞的监听不获取,当我们异步链接的操作完成之后,无论我们的异步操作是否成功,这个对象都能够接到如下三个参数:
1.一个NSURLResopne,这个对象是服务器返回给我们的数据包装对象。2.NSData,可选的,这个是我们通过URL请求返回的数据。3.NSError类型的对象,如果请求中有错误发生。
这个sendAsynchronousRequest:queue:completionHandler方法如果是添加在主线程上的将不会被调用,因此如果你想执行一个跟UI相关的任务,那么你的主线程就会被堵塞。
NSString *urlAsString = @"";
NSURL *url = [NSURL URLWithString:urlAsString];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[NSURLConnection sendAsynchronousRequest: urlRequest queue:queue completionHandler:^(
NSURLResponse *response,
NSData *data,
NSError *error
){
if([data length>0] && error == nil){
NSString *html = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"HTML = %@",html);
}else if([data length] == 0 && error == nil){
NSLog(@"Nothing was downloaded.");
}else if(error != nil){
NSLog(@"Error happened = %@",error);
}
}];
如果你想保存从网络上下载的数据到你的硬盘中,那么你要在完成的block中将使用NSData的适当方法。
NSString *urlAsString = @"";
NSURL *url = [NSURL URLWithString:urlAsString];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[NSURLConnection sendAsynchronousRequest: urlRequest queue:queue completionHandler:^(
NSURLResponse *response,
NSData *data,
NSError *error
){
if([data length>0] && error == nil){
NSString * documentsDir= [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
NSString *filePath = [documentsDir stringByAppendingPathComponent:@"apple.html"];
[data writeToFile:filePath atomically:YES];
NSLog(@"Successfully saved the file to %@",filePath);
}else if([data length] == 0 && error == nil){
NSLog(@"Nothing was downloaded.");
}else if(error != nil){
NSLog(@"Error happened = %@",error);
}
}];
捕获异步链接中超时的问题
在创建一个URL请求对象并且准备传递给NSURLConnection,设置一下你的超时值。
NSString *urlAsString = @"";
NSURL *url = [NSURL URLWithString:urlAsString];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:30.0f];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[NSURLConnection sendAsynchronousRequest: urlRequest queue:queue completionHandler:^(
NSURLResponse *response,
NSData *data,
NSError *error
){
if([data length>0] && error == nil){
NSString *html = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"HTML = %@",html);
}else if([data length] == 0 && error == nil){
NSLog(@"Nothing was downloaded.");
}else if(error != nil){
NSLog(@"Error happened = %@",error);
}
}];
解析的时候超过了30秒,那么运行的时候这个访问对象将会给你一个超时的错误。
通过NSURLConnection创建一个同步的下载
通过NSURlConnection的sendSynchronousRequest:returningResponse:error:方法创建一个同步的网络连接。