作为使用最广泛的网络第三方框架,AFNetworking2.0对最新的iOS特性有很好的支持,对NSURL进行了封装,使用更加简便,功能更加完善。
导入AFNetworking
1:Github下载地址:https://github.com/AFNetworking/AFNetworking
2:将AFNetworking和UIKit+AFNetworking拖入当前的工程中,iOS7之后对网络的访问要另加设置,不要忘记开启网络(info.plist中添加App Transport Security Settings,在其下添加Allow Arbitrary Loads并设置其value为YES)
另种方法:在终端利用cocoaPods来将AFNetworking配置到当前工程中
1:终端输入:pod search AFNetworking并拷贝
2:cd到当前工程目录
3:初始化cocoa环境:pod init (会自动创建Podfile文件)
4:编辑Podfile文件:vim Podfile
5:在终端中输入i,表示插入内容到Podfile
6:在target ‘工程名’ do与end之间写入拷贝的AFNetworking库
7:输入完以后,按下Esc键退出编辑状态,然后输入:wq,保存并退出。
8:在Finder中打开工程目录,在.xcworkspace中进行下面的编辑任务即可。
使用AFNetworking实现基本的下载数据任务
#import "ViewController.h"
#import "AFNetworking.h"
#import "UIProgressView+AFNetworking.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
@property (weak, nonatomic) IBOutlet UILabel *progressLabel;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
//downloadButton控制下载的方法
- (IBAction)downloadTask:(id)sender {
//记住这个套路!!!
//下载地址
NSString *urlString = @"http://218.76.27.57:8080/chinaschool_rs02/135275/153903/160861/160867/1370744550357.mp3";
//创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
//创建会话管理对象(在不使用Configuration来设置时用默认的manager足矣)
AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
//创建下载任务
NSURLSessionDownloadTask *downloadTask = [sessionManager downloadTaskWithRequest:request progress:^(NSProgress *downloadProgress) {
//progressView和progressLabel同步进度
_progressView.observedProgress = downloadProgress;
NSString *progressString = [NSString stringWithFormat:@"%.1f%%", downloadProgress.completedUnitCount * 1.0 / downloadProgress.totalUnitCount * 100];
[_progressLabel performSelectorOnMainThread:@selector(setText:) withObject:progressString waitUntilDone:YES];
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
//接收到响应,准备开始接受数据
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
//打印请求状态码
NSLog(@"状态码:%li", httpResponse.statusCode);
//targetPath临时问价保存路径
//返回值为本次下载任务的保存路径
NSString *filePath1 = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/菊花台.mp3"];
//此block返回值为下载完之后文件存放的路径
//这个返回的NSURL后面会传到filePath,因此这里自己设置的filePath可以随意取名
return [NSURL fileURLWithPath:filePath1];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
//这个block返回的filePath实际上就是我们上面给他的确定的filePath,在这里他提供了这个可查下载文件路径的参数
NSLog(@"下载完成路径:%@", filePath);
}];
//开始任务
[downloadTask resume];
//设置progressView的进度
// [_progressView setProgressWithDownloadProgressOfTask:downloadTask animated:YES];
}
使用AFNetworking实现基础的上传任务(本地上传图片和文字到新浪微博,新浪微博的用户token和发布微博消息的api已拿到)
#import "AFNetworking.h"
#import "UIKit+AFNetworking.h"
#import "UIProgressView+AFNetworking.h"
#import "ViewController.h"
@class AFHTTPSessionManager;
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
@property (weak, nonatomic) IBOutlet UITextField *textField;
@property (weak, nonatomic) IBOutlet UILabel *progressLabel;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)uploadTask:(id)sender {
if (_textField.text.length == 0) {
return;
}
//上传路径
NSString *urlString = @"https://api.weibo.com/2/statuses/upload.json";
//登录认证
NSString *token = @"2.00hd363CtKpsnBedca9b3f35tBYiPD";
//拼接参数列表
NSDictionary *dic = @{@"access_token" : token, @"status" : _textField.text};
//创建manager
AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
//创建上传方法
NSURLSessionDataTask *dataTask = [sessionManager POST:urlString parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
//本地文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"gem" ofType:@"jpeg"];
NSData *imageData = [NSData dataWithContentsOfFile:filePath];
//添加上传的数据
[formData appendPartWithFileData:imageData name:@"pic" fileName:@"gem.jpeg" mimeType:@"image/jpeg"];
//新版本AFNetworking提供了progress的参数
} progress: ^(NSProgress * uploadProgress){
NSLog(@"%@", uploadProgress);
//progressLabel和progressView同步显示进程
NSString *labelString = [NSString stringWithFormat:@"%.1f%%", (CGFloat)uploadProgress.completedUnitCount / uploadProgress.totalUnitCount * 100];
[_progressLabel performSelectorOnMainThread:@selector(setText:) withObject:labelString waitUntilDone:YES];
_progressView.observedProgress = uploadProgress;
}success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"上传成功:%@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"上传失败:%@",error);
}];
// [_progressView setProgressWithUploadProgressOfTask:(NSURLSessionUploadTask *)dataTask animated:YES];
}