iOS实现NSURLConnection进行异步下载

来源:互联网 发布:阿里云服务器租用费用 编辑:程序博客网 时间:2024/05/21 21:44

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);
}

}]; 

原创粉丝点击