NSURLConnection 提供了两种方式来实现连接,一种是同步的另一种是异步的,异步 的连接将会创建一个新的线程,这个线程将会来负责下载的动作。而对于同步连接,在下载 连接和处理通讯时,则会阻塞当前调用线程。
为了能够创建一个异步的请求连接,我们需要做如下的操作。
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 = [NSSearchPathForDirectori
YES) objectAtIndex:0];
NSString *filePath = [documentsDir stringByAppendingPathCom
[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);
}
}];