您的位置:首页 > 移动开发 > IOS开发

iOS实现NSURLConnection进行异步下载

2013-10-10 09:20 363 查看
NSURLConnection 提供了两种方式来实现连接,一种是同步的另一种是异步的,异步 的连接将会创建一个新的线程,这个线程将会来负责下载的动作。而对于同步连接,在下载
连接和处理通讯时,则会阻塞当前调用线程。

    许多开发者都会认为同步的连接将会堵塞主线程,其实这种观点是错误的。一个同步的 连接是会阻塞调用它的线程。如果你在主线程中创建一个同步连接,没错,主线程会阻塞。 但是如果你并不是从主线程开启的一个同步的连接,它将会类似异步的连接一样。因此这种 情况并不会堵塞你的主线程。事实上,同步和异步的主要区别就是运行 runtime 为会异步连
接创建一个线程,而同步连接则不会。

为了能够创建一个异步的请求连接,我们需要做如下的操作。
1. 创建一个 NSSring 类型的 URL 连接字符串。
2. 把 NSString 类型转化成 NSURL 类型。
3. 把我们的URL对象赋值到 NSURLRequest 对象中,如果是多个连接请求,请使用

NSMutableURLRequest.

4. 创建一个 NSURLConnection 的连接实例,然后把我们定义好的 URL 请求赋值过去。 

我们可以通过 NSURLConnection 的 sendAsynchronousRequest:queue:completionHandler 这个方法创建一个异步的 URL 连接对象。这个方法的参数如下:

sendAsynchronousRequest:

一个 NSURLRequest 类型的请求,这个我们已经讲过。
Queue 一个操作队列,我们可以很轻松的分配和初始化一个操作队列,然后可以根据我们需求添加
到这个参数中。

completionHandler:

这是一个 block 对象,当我们异步的连接操作完成之后,无论我们的异步操作是否成功,都
会执行这个 block,这个 block 对象都能够接收到如下三个参数:

1.一个 NSURLResopne,这个对象封装了服务器返回给我们 response。

2.NSData,可选的,这个是我们通过 URL 请求返回的数据。

3.NSError 类型的对象,如果请求中有错误发生。

讲了那么多,让我们还是来看看代码例子吧,下面的例子中,我们将会通过访问苹果网 站的主页获取HTML 内容,然后将内容打印到 console 窗口:

NSString *urlAsString = @"http://www.apple.com";
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 = @"http://www.apple.com";
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);

}

}]; 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  NSURLConnection ios