//AFNetworking 网络库的使用
//1. AFNetworking网路库的介绍
// 通过HTTP接口获取数据,上传数据
// (1)NSURLConnection
// (2)ASIHttpRequest(较早,停止更新)
// (3)AFNetworking
// 简单易用, 回调使用block
// AFNetworking是一个处理HTTP请求的,健壮(有一些小bug),易用的网络开源库
//<2> 实现GET请求
//[self testGetRequest];
//<3> 实现POST请求
// GET请求: http://www.baidu.com/s?wd=小苹果
// POST请求:
// 发送用户名和密码到服务器
// 上传文件到服务器
// 特点: 发送附加数据不会出现在URL网址中
// 数据会附加到请求中发送
//[self testPostRequest];
//<4> 下载JSON数据, 下载XML数据(差不多)
//[self testJSONRequest];
//<5> 如何上传文件(上传图片文件)
//[self testUploadFile];
//<6> 如何下载文件+下载进度监视(KVO)
//[self testDonwloadFile];
//<7> 图片的异步加载
// 可以使用 SDWebImage开源库
// 还可以使用 AFNetworking 异步下载图片
//[self testAsyncLoadImage];
//<8> 判断网络状态
[selftestNetworkStatus];
}
#pragma mark - 判断网络状态
-(void)testNetworkStatus
{
//判断网络的原理: 和某个网址(www.baidu.com)进行连接
// 注意: 填写域名即可
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManageralloc] initWithBaseURL:[NSURLURLWithString:@"www.baidu.com"]];
[manager.reachabilityManagersetReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
//设置网络状态改变后执行的block
//4种状态(未知,不可达,GPRS,WiFi)
/*
AFNetworkReachabilityStatusUnknown
AFNetworkReachabilityStatusNotReachable
AFNetworkReachabilityStatusReachableViaWWAN
AFNetworkReachabilityStatusReachableViaWiFi
*/
NSLog(@"当前网络状态为 %@",@[@"不可达",@"使用GPRS",@"使用WiFi"][status]);
if(status == AFNetworkReachabilityStatusNotReachable)
{
UIAlertView *alertView = [[UIAlertView alloc] init];
alertView.message = @"亲,敢不敢打开网络?";
[alertView addButtonWithTitle:@"取消"];
[alertView show];
}
}];
//开始启动网络状态的监听
[manager.reachabilityManagerstartMonitoring];
}
#pragma mark - 图片的异步加载
-(void)testAsyncLoadImage
{
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 200, 100, 200)];
[self.view addSubview:imageView];
//imageView添加图片, 图片来源于网络
NSString *urlString = @"http://img0.bdstatic.com/img/image/logo_cacece1e9a.png";
[imageView setImageWithURL:[NSURL URLWithString:urlString]];
/*
[imageView setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]] placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
NSLog(@"加载完成");
imageView.image = image;
imageView.bounds = CGRectMake(100, 200, image.size.width, image.size.height);
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"加载失败");
}];
*/
}
#pragma mark - 如何下载文件
-(void)testDonwloadFile
{
//文件网址
NSString *urlString = @"http://imgcache.qq.com/club/item/avatar/zip/7/i87/all.zip";
//下载使用的类 - AFURLSessionManager
AFURLSessionManager *manager = [[AFURLSessionManageralloc] initWithSessionConfiguration:[NSURLSessionConfigurationdefaultSessionConfiguration]];
//参数1: 下载文件的地址
//参数2: 进度对象
//参数3: block中返回下载文件存储位置
//参数4: block下载完成后执行
//进度类,
//重要属性: fractionCompleted 完成百分比
NSProgress *progress = nil;
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]] progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
//返回地址, 告诉manager文件存放在哪儿
NSString *path = [NSStringstringWithFormat:@"%@/Documents/downfile.zip",NSHomeDirectory()];
return [NSURL fileURLWithPath:path];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
if(error == nil)
{
NSLog(@"下载完成");
}
else
{
NSLog(@"下载失败 error = %@",error);
}
}];
//开始下载
[downloadTask resume];
//为progress对象的fractionCompleted添加监听
[progress addObserver:selfforKeyPath:@"fractionCompleted"options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNewcontext:nil];
_progressView = [[UIProgressViewalloc] initWithFrame:CGRectMake(20, 100, 280, 20)];
[self.viewaddSubview:_progressView];
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
float fractionCompleted = [[object valueForKey:@"fractionCompleted"] floatValue];
NSLog(@"下载进度为 = %f%%",fractionCompleted*100);
//注意:
//以后说
// 线程中: 工作线程中不能修改UI线程中的控件
[[NSOperationQueuemainQueue] addOperationWithBlock:^{
_progressView.progress = fractionCompleted;
}];
}
#pragma mark - 实现上传文件
-(void)testUploadFile
{
//接口:
// http://quiet.local/uploadtest/pk.phpimage
NSString *urlString = @"http://quiet.local/uploadtest/pk.php";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];
manager.responseSerializer = [AFHTTPResponseSerializerserializer];
[manager POST:urlString parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
//上传文件附加到 formData 中
NSString *path = [[NSBundlemainBundle] pathForResource:@"menu_bg_01-hd.jpg"ofType:nil];
//添加文件数据
//参数1: 文件路径
//参数2: 接口中数据的key值
//参数3: 上传后的文件名(不要重名)
//参数4: 文件类型
[formData appendPartWithFileURL:[NSURLfileURLWithPath:path] name:@"image"fileName:@"quiet.png"mimeType:@"image/jpg"error:nil];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *str = [[NSStringalloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"str = %@",str);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error = %@",error);
}];
}
-(void)testJSONRequest
{
NSString *str = @"http://www.weather.com.cn/data/cityinfo/101010100.html";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];
manager.responseSerializer = [AFHTTPResponseSerializerserializer];
[manager GET:str parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
//JSON解析
NSDictionary *dict = [NSJSONSerializationJSONObjectWithData:responseObject options:NSJSONReadingMutableContainerserror:nil];
NSLog(@"dict = %@",dict);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error = %@",error);
}];
}
#pragma mark - 实现POST请求
-(void)testPostRequest
{
//接口
//http://quiet.local/testdir/login.php
// @"user": @"quiet"
// @"password": @"1234"
NSString *urlString = @"http://quiet.local/testdir/login.php";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];
manager.responseSerializer = [AFHTTPResponseSerializerserializer];
[manager POST:urlString parameters:@{@"user":@"quiet",@"password":@"123456"} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *str = [[NSStringalloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"str = %@",str);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error = %@",error);
}];
}
#pragma mark - 实现GET请求
-(void)testGetRequest
{
//实例: 下载http://www.baidu.com数据
NSString *urlString = @"http://www.baidu.com";
//非常重要的类 AFHTTPRequestOperationManager
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];
//错误: Code=-1016
//这个类默认下载数据是Json格式数据
//content-type应该是 "text/json"
//表示数据应该是二进制数据
manager.responseSerializer = [AFHTTPResponseSerializerserializer];
[manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
//NSLog(@"responseObject = %@",responseObject);
NSString *str = [[NSStringalloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"str = %@",str);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error = %@",error);
}];
}