#import "ViewController.h"
#import "AFNetworking.h"
#import
"SSZipArchive.h"
@interface ViewController ()
{
// AFN的客户端,使用基本地址初始化,同时会实例化一个操作队列,以便于后续的多线程处理
AFHTTPClient *_httpClient;
// 下载操作
AFHTTPRequestOperation *_downloadOperation;
NSOperationQueue *_queue;
}
@property
(weak, nonatomic) IBOutlet UIProgressView
*progressView;
@end
@implementation
ViewController
/*
关于文件下载,在Documents中保存的文件,一定是要应用程序产生的文件或者数据
没有明显提示用户下载到本地的文件不能保存在Docuemnts中!
*/
-
(void)viewDidLoad
{
[super
viewDidLoad];
NSURL *url = [NSURL
URLWithString:@"http://192.168.3.251/~apple/itcast"];
_httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
_queue = [[NSOperationQueue alloc]
init];
}
#pragma mark - 文件上传
-
(IBAction)uploadImage
{
/*
此段代码如果需要修改,可以调整的位置
1.
把upload.php改成网站开发人员告知的地址
2.
把file改成网站开发人员告知的字段名
*/
// 1.
httpClient->url
// 2.
上传请求POST
NSURLRequest *request = [_httpClient
multipartFormRequestWithMethod:@"POST" path:@"upload.php" parameters:nil
constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
{
//
在此位置生成一个要上传的数据体
//
form对应的是html文件中的表单
/*
参数
1.
要上传的[二进制数据]
2.
对应网站上[upload.php中]处理文件的[字段"file"]
3. 要保存在服务器上的[文件名]
4.
上传文件的[mimeType]
*/
UIImage *image = [UIImage
imageNamed:@"头像1"];
NSData *data =
UIImagePNGRepresentation(image);
//
在网络开发中,上传文件时,是文件不允许被覆盖,文件重名
//
要解决此问题,
//
可以在上传时使用当前的系统事件作为文件名
NSDateFormatter *formatter = [[NSDateFormatter alloc]
init];
//
设置时间格式
formatter.dateFormat =
@"yyyyMMddHHmmss";
NSString *str =
[formatter stringFromDate:[NSDate
date]];
NSString *fileName =
[NSString stringWithFormat:@"%@.png",
str];
[formData
appendPartWithFileData:data name:@"file" fileName:fileName
mimeType:@"image/png"];
}];
// 3.
operation包装的urlconnetion
AFHTTPRequestOperation *op =
[[AFHTTPRequestOperation alloc] initWithRequest:request];
[op
setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id
responseObject) {
NSLog(@"上传完成");
} failure:^(AFHTTPRequestOperation
*operation, NSError *error) {
NSLog(@"上传失败->%@", error);
}];
[_httpClient.operationQueue
addOperation:op];
}
-
(IBAction)pauseResume:(id)sender
{
//
关于暂停和继续,AFN中的数据不是线程安全的
//
如果使用操作的暂停和继续,会使得数据发生混乱
// 不建议使用此功能。
// 有关暂停和后台下载的功能,NSURLSession中会介绍。
if
(_downloadOperation.isPaused) {
[_downloadOperation resume];
} else
{
[_downloadOperation
pause];
}
}
#pragma mark 下载
-
(IBAction)download
{
// 1. 建立请求
NSURLRequest *request = [_httpClient requestWithMethod:@"GET"
path:@"download/Objective-C2.0.zip" parameters:nil];
// 2. 操作
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc]
initWithRequest:request];
_downloadOperation = op;
//
下载
// 指定文件保存路径,将文件保存在沙盒中
NSArray
*docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *path = [docs[0]
stringByAppendingPathComponent:@"download.zip"];
op.outputStream = [NSOutputStream
outputStreamToFileAtPath:path append:NO];
// 设置下载进程块代码
/*
bytesRead
当前一次读取的字节数(100k)
totalBytesRead
已经下载的字节数(4.9M)
totalBytesExpectedToRead
文件总大小(5M)
*/
[op
setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long
long totalBytesExpectedToRead) {
//
设置进度条的百分比
CGFloat precent =
(CGFloat)totalBytesRead /
totalBytesExpectedToRead;
NSLog(@"%f", precent);
_progressView.progress =
precent;
}];
// 设置下载完成操作
[op
setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id
responseObject) {
//
下载完成之后,解压缩文件
/*
参数1:要解结压缩的文件名及路径 path -
> download.zip
参数2:要解压缩到的位置,目录 - >
document目录
*/
[SSZipArchive
unzipFileAtPath:path
toDestination:docs[0]];
//
解压缩之后,将原始的压缩包删除
//
NSFileManager专门用于文件管理操作,可以删除,复制,移动文件等操作
// 也可以检查文件是否存在
[[NSFileManager
defaultManager] removeItemAtPath:path
error:nil];
//
下一步可以进行进一步处理,或者发送通知给用户。
NSLog(@"下载成功");
} failure:^(AFHTTPRequestOperation
*operation, NSError *error) {
NSLog(@"下载失败");
}];
// 启动下载
[_httpClient.operationQueue addOperation:op];
}
#pragma mark
检测网路状态
/*
AFNetworkReachabilityStatusUnknown
= -1,
未知
AFNetworkReachabilityStatusNotReachable =
0, 未连接
AFNetworkReachabilityStatusReachableViaWWAN =
1, 3G
AFNetworkReachabilityStatusReachableViaWiFi =
2, 无线连接
*/
-
(IBAction)checkNetwork:(id)sender
{
// 1. AFNetwork
是根据是否能够连接到baseUrl来判断网络连接状态的
//
提示:最好使用门户网站来判断网络连接状态。
NSURL *url = [NSURL
URLWithString:@"http://www.baidu.com"];
AFHTTPClient *client = [[AFHTTPClient alloc]
initWithBaseURL:url];
_httpClient =
client;
[_httpClient
setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
{
//
之所以区分无线和3G主要是为了替用户省钱,省流量
//
如果应用程序占流量很大,一定要提示用户,或者提供专门的设置,仅在无线网络时使用!
switch (status)
{
case
AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"无线网络");
break;
case
AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"3G网络");
break;
case
AFNetworkReachabilityStatusNotReachable:
NSLog(@"未连接");
break;
case
AFNetworkReachabilityStatusUnknown:
NSLog(@"未知错误");
break;
}
}];
}
/**
官方建议AFN的使用方法
1.
定义一个全局的AFHttpClient:包含有
1>
baseURL
2> 请求
3> 操作队列
NSOperationQueue
2.
由AFHTTPRequestOperation负责所有的网络操作请求
*/
#pragma mark -
Actions
- (void)loadJSON1
{
// 1.
NSURL
NSURL *url = [NSURL
URLWithString:@""];
// 2.
NSURLRequest
NSURLRequest *request = [NSURLRequest
requestWithURL:url];
// 3.
NSURLConnection
[NSURLConnection
sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError
*connectionError) {
if (connectionError != nil)
{
NSLog(@"%@",
connectionError.localizedDescription);
} else {
NSError *error =
nil;
NSArray *array = [NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingAllowFragments
error:&error];
if
(error != nil)
{
NSLog(@"%@",
error.localizedDescription);
} else
{
NSLog(@"%@",
array);
}
}
}];
}
#pragma mark 加载JSON
-
(IBAction)loadJSON
{
// 1.
NSURLRequest
NSURLRequest *request = [_httpClient
requestWithMethod:@"GET" path:@"videos.php?format=json"
parameters:nil];
// 2.
连接
AFJSONRequestOperation *op = [AFJSONRequestOperation
JSONRequestOperationWithRequest:request success:^(NSURLRequest *request,
NSHTTPURLResponse *response, NSArray *JSON)
{
//
成功之后,直接使用反序列化出来的结果即可。
NSLog(@"%@",
JSON);
} failure:^(NSURLRequest *request,
NSHTTPURLResponse *response, NSError *error, id JSON)
{
// 1>
网络访问获取数据出错
// 2>
JSON的反序列化出错
NSLog(@"%@ %@", error,
JSON);
}];
//
3. 将操作添加到队列,开始多线程操作
//
将操作添加到队列或者start,操作就会启动
[_httpClient.operationQueue
addOperation:op];
// [_queue
addOperation:op];
// [op start];
}
-
(IBAction)loadXML:(id)sender
{
}
原文:http://www.cnblogs.com/mcj-coding/p/3581527.html