#import "ViewController.h"
#import "AFNetworking.h"
#import "UIKit+AFNetworking.h"
#define URLString @"http://img15.3lian.com/2015/f2/52/d/45.jpg"
#define URSLString_JSON @"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id="
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
@end
@implementation ViewController {
NSProgress *_progress;
NSURLSessionDownloadTask *_downloadTask;
}
// 有些url不可用,是假地址,不过实现都正确的~~~~~~~~~~·
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSURL *url = [NSURL URLWithString:URLString];
/** 01~~~~判断网络状态类型 */
// [self judgeNetWorkType];
/** 02~~~~异步下载图片 */
// [self asyncDonwloadImage:url];
/** 03~~~~GET请求 JSON数据 */
// [self jsonGETRequest:[NSURL URLWithString:URSLString_JSON]];
/** 04~~~~GET请求 非JSON数据 */
// [self dataGETRequest:url];
/** 05~~~~POST请求 */
// [self postRequest];
/** 06~~~~POST上传 */
// [self postUpload:nil];
/** 07~~~~文件下载*/
// [self downloadFile:@"http://3.jxdx1.crsky.com/download/StormPlayer1.43.0.exe"];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.imageView.backgroundColor = [UIColor lightGrayColor];
self.progressView.hidden = YES;
}
#pragma mark - '07 文件下载'
- (void)downloadFile:(NSString *)urlString {
// 1!~~~管理者
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSString *url = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
// 2!~~~和NSURLSession连用
__autoreleasing NSProgress *progress = nil; // 进度
NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
// Documents路径URL 方式1 直接拼接URL
NSURL *downloadUrl = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
// return [downloadUrl URLByAppendingPathComponent:[[response URL] lastPathComponent]];
// 2.5 ~~~~存储路径
return [downloadUrl URLByAppendingPathComponent:[response suggestedFilename]];
/* 方式1 先拼接路径,然后转化为URL
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
path = [path stringByAppendingPathComponent:[response suggestedFilename]];
return [NSURL fileURLWithPath:path];
*/
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
if (error) {
NSLog(@"error:%@",error);
} else {
NSLog(@"filePath:%@",filePath);
}
}];
[task resume];
// NSProgress
_progress = progress;
// nil 表示全局
// 添加进度观察者(keyPath为当前进度完成量) @property (readonly) double fractionCompleted;
[_progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:nil];
}
// 监听响应事件
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
// self.progressView.progress = [[change objectForKey:@"new"] floatValue];
// NSLog(@"%.1f",[[change objectForKey:@"new"] floatValue]);
// 如果被监听对象为_progress 并且keyPath是@“fractionCompleted”
if (object == _progress && [keyPath isEqualToString:@"fractionCompleted"]) {
NSLog(@"%f",_progress.fractionCompleted);
// 回到主队列显示进度条 UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.progressView.hidden = NO;
// 进度条的进度即被监听对象的fractionCompleted (完成部分)
self.progressView.progress = _progress.fractionCompleted;
}];
if (self.progressView.progress == 1.0) {
self.progressView.hidden = YES;
}
}
}
#pragma mark - 06 'POST上传'
- (void)postUpload:(NSString *)urlString {
// 01~~~~管理者
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 02~~~~返回data
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// 03~~~请求上传 构造body 请求体
[manager POST:urlString parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
NSString *path = [[NSBundle mainBundle] pathForResource:@"icon" ofType:@"png"];
// 上传文件的格式信息等.....交给框架它会给你处理
[formData appendPartWithFileURL:[NSURL fileURLWithPath:path] name:@"image" fileName:@"icon.png" mimeType:@"image/png" error:nil];
// mimeTypec
// [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"];
// [mutableHeaders setValue:mimeType forKey:@"Content-Type"];
// Content-Disposition
// Content-Type
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"response:%@",string);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error:%@",error);
}];
}
#pragma mark - 05 ‘POST请求’
/** POST请求 */
- (void)postRequest {
// 01~~~~管理者
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 1.5~~~~ 参数
NSDictionary *params = @{
@"username":@"bajie",
@"password":@"ershixiong",
@"message":@"houge,shifubeizhuazoule"
};
// 02~~~~返回data数据不需要解析
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// 03~~~~开始请求吧
[manager POST:@"http://10.0.166.180/post1.html" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 需要utf-8编码
NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"%@",string);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error:%@",error);
}];
}
#pragma mark - 04 ‘GET请求 非JSON数据’
/** GET请求 非JSON数据 */
- (void)dataGETRequest:(NSURL *)url {
// 01~~~数据请求队列的管理器
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 02~~~~这样写的话,返回数据是data类型。告诉框架不需要解析
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// 03~~~~开始请求吧~~
[manager GET:URLString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"response:%@",[responseObject class]);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error:%@",error);
}];
}
#pragma mark - 03 ‘GET请求 JSON数据’
/** GET请求 JSON数据 */
- (void)jsonGETRequest:(NSURL *)url {
// 01~~~数据请求队列的管理器
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 02~~~这样设置就会进行json解析 其实AFNetWoring框架默认就是JSON解析
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", nil];
// manager.responseSerializer = [AFJSONResponseSerializer serializer];
// 03~~~开始请求吧~~~ 创建请求对象,然后加入到NSOperationQueue,自动异步执行(多线程)
[manager GET:URLString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"response:%@",responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error:%@",error);
}];
}
#pragma mark - 02 '异步下载图片'
/** 异步下载图片 */
- (void)asyncDonwloadImage:(NSURL *)url {
// UIImageView + AFNetWorking
[self.imageView setImageWithURL:url];
}
#pragma mark - 01 '判断当前的网络状态'
/** 判断网络状态类型 */
- (void)judgeNetWorkType {
// 1~~~请求队列的管理员
NSURL *baseURL = [NSURL URLWithString:@"www.baidu.com"];
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];
// 2~~~reachability 可达性 可达到性 网络状态管理员设置回调block
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
// AFNetworkReachabilityStatusUnknown = -1,
// AFNetworkReachabilityStatusNotReachable = 0,
// AFNetworkReachabilityStatusReachableViaWWAN = 1,
// AFNetworkReachabilityStatusReachableViaWiFi = 2,
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"StatusUnknown");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"StatusNotReachable");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"StatusReachableViaWWAN");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"StatusReachableViaWiFi");
break;
default:
break;
}
}];
// 3~~~启动网络监控
[manager.reachabilityManager startMonitoring];
}
@end