AFNetworking

老牛浏览 344评论 0发表于
#import "ViewController.h"
#import "AFNetworking.h"
#import "UIKit+AFNetworking.h"
@interface ViewController ()

//显示下载的进度
@property(nonatomic, strong)UIProgressView *progressView;
@end

@implementation ZKViewController

- (void)viewDidLoad
{
[super viewDidLoad];

/**
1.简单介绍AFNetworking
2.Get的简单使用
3.json/xml数据的解析
4.post上传图片
5.使用AFNetworking下载数据
6.图片的异步请求
7.判断网络状态
*/

//1.简单介绍AFNetworking
/**
使用http网络请求方式:
三种:
一:NSURLConnection(oc自带的)
二:ASIHttpRequest(较早时候使用,现在已很少)
三:AFNetworking(正在使用)  好处:由于使用了block,更加的简单,健壮。
*/

//2.Get的简单使用
//请求方式Get,post
/**
2.1. 一般get是从服务器上获取数据,post是向服务器传送数据。
2.2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
2.3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
2.4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
2.5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

建议:
2.1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2.2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式; */

//[self testGetRequest];

//3.json/xml数据的解析
//[self testJSON];

//4.post上传图片
//4.1 测试post
//[self testPost];

//4.2 测试上传
//[self testUploadImage];

//5.使用AFNetworking下载数据
//创建进度条
self.progressView = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleBar];
self.progressView.backgroundColor = [UIColor redColor];
self.progressView.frame = CGRectMake(10, 100, 300, 0);
[self.view addSubview:self.progressView];
//[self testDownloadData];

//6.图片的异步请求
[self testAsycnImage];

//7.判断网络状态
// Do any additional setup after loading the view, typically from a nib.

}

-(void)testNetworkStatus{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//BLOCK返回了status

[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
//status:四种值   未知,不可达,GPRS,WiFi
NSLog(@"%@",@[@"不可达",@"GPRS",@"WiFi"][status]);
}];

//开始启动监听网络状态
[manager.reachabilityManager startMonitoring];
}

-(void)testAsycnImage{
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(10, 10, 100, 100)];
[self.view addSubview:imageView];
NSString *path = @"http://10.0.157.3/iOS_PHP/upload/image1";

//方法一:通过AFNetworking的方法异步下载图片
//[imageView setImageWithURL:[NSURL URLWithString:path]];

//方法二:通过block方法
[imageView setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:path]] placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {//成功的时候执行
imageView.frame = CGRectMake(10, 10, image.size.width, image.size.height);
imageView.image = image;
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {//失败的时候执行
}];
}

-(void)testDownloadData{
NSString *path = @"http://imgcache.qq.com/club/item/avatar/zip/7/i87/all.zip";

//下载使用的管理类-AFURLSessionManager
AFURLSessionManager *manager = [[AFURLSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
/**
第一个参数:下载文件的地址
二:进度类的对象的地址
三:block:下载文件后保存文件的位置
四:block:下载完成后执行
*/

//进度类
NSProgress *progress = nil;

//下载使用的类
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:path]] progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {

//返回地址,告诉manager文件放在那里
NSString *path = [NSString stringWithFormat:@"%@/documents/downloadfile.zip",NSHomeDirectory()];

NSLog(@"%@",path);
return [NSURL fileURLWithPath:path];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
if (error == nil) {
NSLog(@"下载成功");
}else{
NSLog(@"下载失败:error:%@",error);
}
}];

//开始下载
[downloadTask resume];

//通过kvo对progress的进度属性进行监听
[progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{

//拿到了进度类里面控制进度的属性
float changeValue = [[object valueForKey:@"fractionCompleted"] floatValue];

//将进度类里面进度的改变赋给进度条
//直接执行,值没有实时改变,原因:下载线程不能实时控制UI线程控件的状态
//    self.progressView.progress = changeValue;

//解决办法:创建一个队列,将改变过程放在block里面即可
//关于队列:后面讲线程的时候,再说。
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.progressView.progress = changeValue;
}];
}

-(void)testUploadImage{
NSString *path = @"http://127.0.0.1/iOS_PHP/upload.php";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

/**
第一个参数:文件要上传的地址
第二个参数:附带的信息
第三个参数:block:上传之后保存的内容(formData)
第四个参数:block:成功后要执行的
第五个参数:block:失败后执行的
*/

[manager POST:path parameters:@{@"user":@"zhangsan",@"password":@"123456"} constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"menu_bg_01-hd.jpg" ofType:nil];
/**
第一个参数:上传文件的地址
第二个参数:文件对应的key
第三个参数:上传后文件的新名字(注意:不要重名)
第四个参数:原来文件的类型
*/
[formData appendPartWithFileURL:[NSURL fileURLWithPath:imagePath] name:@"file" fileName:@"image1.png" mimeType:@"image/jpg" error:nil];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *string = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"%@",string);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@",error);
}];
}

-(void)testPost{
NSString *path = @"http://127.0.0.1/iOS_PHP/login";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

/**
第一个参数:文件要上传的地址
第二个参数:附带的信息
第三个参数:block:上传之后保存的内容(formData)
第四个参数:block:成功后要执行的
第五个参数:block:失败后执行的
*/

[manager POST:path parameters:@{@"user":@"zhangsan",@"password":@"123456"} constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *string = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"%@",string);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@",error);
}];
}

-(void)testJSON{

//请求数据的地址
NSString *path = @"http://www.weather.com.cn/data/cityinfo/101010100.html";

//创建管理类
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

//设置数据二进制,数据格式默认json
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

//利用方法请求数据
[manager GET:path parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@",dic);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@",error);
}];
}

-(void)testGetRequest{

//实例:使用get方式从@"<a href="http://www.baidu.com">http://www.baidu.com</a>"下载数据
NSString *path= @"http://www.baidu.com";
//管理类(非常重要)
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

//设置content-type 默认是json格式
//设置传输数据是二进制的
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

//第一个参数:要下载数据的来源
//第二个参数:附带的一些信息(可以为空)
//第三个参数:block 是成功之后执行
//第四个参数:block 是失败的时候执行
[manager GET:path parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {//block里面:第一个参数:是默认参数  第二个参数:得到的数据
NSString *string = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"string:%@",string);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@",error);
}];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end
点赞
收藏
暂无评论,快来发表评论吧~
私信
老牛@ilaoniu
老牛,俗称哞哞。单纯的九零后理工小青年。喜欢折腾,爱玩,爱音乐,爱游戏,爱电影,爱旅游...
最后活跃于