您的位置:首页 > 理论基础 > 计算机网络

(新版 和 旧版) AFNetwork 简单的使用说明--第三方库(ARC)--监听当前网络状态 -- 设置最大等待时间

2014-12-10 16:29 471 查看
AF的请求
是基于NSURLReuqest的。且使用的时异步队列,AFHTTPRequestOperation

在新版的AFNetWorking加入了监听当前网络的状态,可以判断当前的移动设备是出于3G/WIFI/还是2G等...,但是新版的需要导入官方库。

使用新版的AFNetWorking需添加官方库:(旧版的不需要)

Security.framework

MobileCoreService.framework

SystemConfiguration.framework

在AFNetWork中设置最大等待时间,可以通过创建请求的时候设置。

//创建请求并设置超时时间

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[baseUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]

cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];

AFNetWork可以有多种请求方式,包含了8种HTTP请求的方式。
!!需要 最后设置开始请求的方式有: [operation start];

在旧版中:

AFHTTPRequestOperation
默认的普通请求,它返回的是NSData数据,需要json或xml解析。

AFJSONRequestOperation json请求,它返回的是json解析后的结果(数组或者字典)。
AFXMLRequestOperation ……

不需要设置开始请求,它会自动开始请求的是:

AFHTTPClient --- 它可以设置(8种Http请求方式)

-(void)startReuest
{
/**
AF的请求 是基于NSURLReuqest的。且使用的时异步队列,AFHTTPRequestOperation
*/
NSURL *url=[NSURL URLWithString:@"https://api.douban.com/v2/book/search?q=harry&start=0"];
AFHTTPRequestOperation *operation=[[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:url]];
//设置完成后的block回调,这里的responseObject就是NSData,需要解析
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

//json或xml解析

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

}];

//开始请求
[operation start];
}

-(void)jsonReuqest
{
NSURL *url=[NSURL URLWithString:@"https://api.douban.com/v2/book/search?q=harry&start=0"];

//  json的AF请求
AFJSONRequestOperation *operation=[[AFJSONRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:url]];
//这里完成请求后,得到的数据在responseObiect里,因为是json请求,所以,它自动的已经解析了,responseObiect就是解析后的字典或数组
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

} failure:
^(AFHTTPRequestOperation *operation, NSError *error) {

}];

[operation start];
}

-(void)clientRequest
{
//baseurl 就是前半段请求地址
AFHTTPClient *client=[[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://10.0.8.8/sns/"]];
/*
使用AFHTTPClient请求的结果responseObject,是NSData,需要解析
*/
//进行get请求
[client getPath:@"my/user_list.php" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

//json 或 xml 解析

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

}];
//进行post请求
[client postPath:@"my/user_list.php" parameters:@{@"count":@"20"} success:^(AFHTTPRequestOperation *operation, id responseObject) {

//json 或 xml 解析

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

}];

}


在新版中:

新版的 AFNetWorking请求是基于一个请求队列管理器 AFHTTPRequestOperationManager来实现请求的。

使用新版的AFNetWorking需添加官方库:(旧版的不需要)

Security.framework

MobileCoreService.framework

SystemConfiguration.framework

代码:

#pragma mark - 判断当前网络状态
- (void)monitorNetworkType
{
//AFNetworking通过呼叫某个服务器来监测网络状态,因此建议呼叫大型门户网站

//创建一个请求队列的管理对象
AFHTTPRequestOperationManager * manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"www.baidu.com"]];

//监控网络状态
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
//异步任务,当网络状态发生改变,回调这个方法
//判断网络状态

switch (status) {
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"网络未连接");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"3G网络");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WIFI网络");
break;

default:
break;
}

}];

//启动监控
[manager.reachabilityManager startMonitoring];
}

#pragma mark - 异步加载图片
//异步下载图片数据,赋给UIImageView
- (void)asyncLoadImage
{
//创建图片视图
UIImageView * imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:imageView];

[imageView setImageWithURL:[NSURL URLWithString:@"http://10.0.8.8/sns/my/headimage.php?uid=10"]];
}

#pragma mark - GET请求 JSON数据
//如果下载的是JSON数据,可以自动解析成字典或数组
- (void)jsonGetRequest
{
//URLString
NSString * urlString = @"http://10.0.8.8/sns/my/user_list.php";

//创建请求数据的队列管理器,单例
AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];

//设置数据的格式
//如果JSON文件就按照下面设置,能自动进行解析
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];

//发起请求了,设置请求成功失败的block
[manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
//成功
//数据会回调在responseObject中,如果是JSON则数据已经被解析,responseObject根据数据源的不同,可能是字典或数组
NSLog(@"%@", responseObject);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//失败
NSLog(@"%@", error);
}];
}

#pragma mark - GET请求 非JSON数据
- (void)dataGetRequest
{
NSString * urlString = @"http://10.0.8.8/sns/my/user_list.php";

AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];

//设置请求的数据格式,设置为data,适用于任何格式,获取到数据之后是NSData格式,我们可以自己解析
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

[manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
//成功
//responseObject装着数据,是NSData
NSString * str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

NSLog(@"%@", str);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
}];
}

#pragma mark - POST请求
- (void)postRequest
{
NSString * url = @"http://localhost/cgi-bin/post1.cgi";
//访问cgi-bin服务器,访问POST1.cgi程序

//创建单例对象
AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];

//获取接收的回馈数据的类型,POST请求也会收到回馈
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

//post键值对
NSDictionary * dict = @{@"username":@"Tom", @"password":@"123456", @"message":@"woooooooooow"};

//发送请求
[manager POST:url parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {

NSLog(@"成功!%@",[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

NSLog(@"失败%@", error);

}];

}

#pragma mark - 上传文件
- (void)uploadFile
{
NSString * url = @"http://localhost/cgi-bin/post2.cgi";

AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

//发送数据
[manager POST:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
//在这里将需要发送的数据,添加到formData对象

//找到图片
NSString * imagePath = [[NSBundle mainBundle] pathForResource:@"annotation" ofType:@"png"];

//将图片转成data
NSData * data = [NSData dataWithContentsOfFile:imagePath];

//将data传给formData
[formData appendPartWithFileData:data name:@"image" fileName:@"annotation.png" mimeType:@"image/png"];
//mimeType:@"image/png" @"text/html" @"text/json" @"text/xml" @"image/jpeg"等

} success:^(AFHTTPRequestOperation *operation, id responseObject) {

NSLog(@"成功");

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

NSLog(@"失败");

}];
}

#pragma mark - 文件下载
- (void)requestFile
{
NSString * urlString = @"http://10.0.8.8/download/归档Archieve.pdf";
//创建下载实用类
AFURLSessionManager * manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
//参数是用来管理进度显示等kvo数据的

//因为路径存在中文,无法转成URL,需要转码
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];

//第一个参数是请求,第二个参数是进度对象指针的地址,为了返回进度

//__autoreleasing修饰传入地址的对象指针
__autoreleasing NSProgress * progress = nil;
//调用函数后,会自动创建一个progress对象,然后改变progress指针的值,让它指向这个对象

//返回一个下载任务
NSURLSessionDownloadTask * task = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
//告诉下载管理器,文件存储的路径
NSString * path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/视频.mp4"];
return [NSURL fileURLWithPath:path];

} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
//下载完成的回调,可能正确可能错误
if (error) {
NSLog(@"%@", error);
}
}];

//启动下载任务
[task resume];

_task = task;

NSLog(@"%@", NSHomeDirectory());

//得到了progress对向
_progress = progress;
//用成员变量指向,如同做了一个强引用,保证刚刚创建的progress对象不会在当前函数结束时消失

//设置观察者,观察进度  属性@"fractionCompleted"表示完成的进度
[_progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:nil];
}

//监控下载进度
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (object == _progress && [keyPath isEqualToString:@"fractionCompleted"] == YES) {
//        NSLog(@"%f%%", [change[@"new"] doubleValue] * 100);
NSLog(@"%.2f%%", _progress.fractionCompleted * 100);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐