AFNetwork 简单的使用说明

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请求方式)


[objc]  view plain copy
  1. -(void)startReuest  
  2. {  
  3.     /** 
  4.             AF的请求 是基于NSURLReuqest的。且使用的时异步队列,AFHTTPRequestOperation 
  5.         */  
  6.     NSURL *url=[NSURL URLWithString:@"https://api.douban.com/v2/book/search?q=harry&start=0"];  
  7.     AFHTTPRequestOperation *operation=[[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:url]];  
  8.     //设置完成后的block回调,这里的responseObject就是NSData,需要解析  
  9.     [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {  
  10.           
  11.         //json或xml解析  
  12.           
  13.           
  14.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  15.           
  16.     }];  
  17.       
  18.     //开始请求  
  19.     [operation start];  
  20. }  
  21.   
  22. -(void)jsonReuqest  
  23. {  
  24.     NSURL *url=[NSURL URLWithString:@"https://api.douban.com/v2/book/search?q=harry&start=0"];  
  25.       
  26.     //  json的AF请求  
  27.     AFJSONRequestOperation *operation=[[AFJSONRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:url]];  
  28.     //这里完成请求后,得到的数据在responseObiect里,因为是json请求,所以,它自动的已经解析了,responseObiect就是解析后的字典或数组  
  29.     [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {  
  30.           
  31.     } failure:  
  32. ^(AFHTTPRequestOperation *operation, NSError *error) {  
  33.       
  34. }];  
  35.       
  36.     [operation start];  
  37. }  
  38.   
  39. -(void)clientRequest  
  40. {  
  41.     //baseurl 就是前半段请求地址  
  42.     AFHTTPClient *client=[[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://10.0.8.8/sns/"]];  
  43.     /* 
  44.                 使用AFHTTPClient请求的结果responseObject,是NSData,需要解析 
  45.         */  
  46.     //进行get请求  
  47.     [client getPath:@"my/user_list.php" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  48.          
  49.         //json 或 xml 解析  
  50.           
  51.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  52.           
  53.     }];  
  54.     //进行post请求  
  55.     [client postPath:@"my/user_list.php" parameters:@{@"count":@"20"} success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  56.           
  57.         //json 或 xml 解析  
  58.           
  59.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  60.           
  61.     }];  
  62.   
  63. }  

在新版中:

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

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

    Security.framework

    MobileCoreService.framework

    SystemConfiguration.framework


代码:


[objc]  view plain copy
  1. #pragma mark - 判断当前网络状态  
  2. - (void)monitorNetworkType  
  3. {  
  4.     //AFNetworking通过呼叫某个服务器来监测网络状态,因此建议呼叫大型门户网站  
  5.       
  6.     //创建一个请求队列的管理对象  
  7.     AFHTTPRequestOperationManager * manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"www.baidu.com"]];  
  8.       
  9.     //监控网络状态  
  10.     [manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {  
  11.         //异步任务,当网络状态发生改变,回调这个方法  
  12.         //判断网络状态  
  13.           
  14.         switch (status) {  
  15.             case AFNetworkReachabilityStatusNotReachable:  
  16.                 NSLog(@"网络未连接");  
  17.                 break;  
  18.             case AFNetworkReachabilityStatusReachableViaWWAN:  
  19.                 NSLog(@"3G网络");  
  20.                 break;  
  21.             case AFNetworkReachabilityStatusReachableViaWiFi:  
  22.                 NSLog(@"WIFI网络");  
  23.                 break;  
  24.                   
  25.                   
  26.             default:  
  27.                 break;  
  28.         }  
  29.           
  30.     }];  
  31.       
  32.     //启动监控  
  33.     [manager.reachabilityManager startMonitoring];  
  34. }  
  35.   
  36. #pragma mark - 异步加载图片  
  37. //异步下载图片数据,赋给UIImageView  
  38. - (void)asyncLoadImage  
  39. {  
  40.     //创建图片视图  
  41.     UIImageView * imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];  
  42.     [self.view addSubview:imageView];  
  43.       
  44.     [imageView setImageWithURL:[NSURL URLWithString:@"http://10.0.8.8/sns/my/headimage.php?uid=10"]];  
  45. }  
  46.   
  47. #pragma mark - GET请求 JSON数据  
  48. //如果下载的是JSON数据,可以自动解析成字典或数组  
  49. - (void)jsonGetRequest  
  50. {  
  51.     //URLString  
  52.     NSString * urlString = @"http://10.0.8.8/sns/my/user_list.php";  
  53.       
  54.     //创建请求数据的队列管理器,单例  
  55.     AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];  
  56.       
  57.     //设置数据的格式  
  58.     //如果JSON文件就按照下面设置,能自动进行解析  
  59.     manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil nil];  
  60.       
  61.       
  62.     //发起请求了,设置请求成功失败的block  
  63.     [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  64.         //成功  
  65.         //数据会回调在responseObject中,如果是JSON则数据已经被解析,responseObject根据数据源的不同,可能是字典或数组  
  66.         NSLog(@"%@", responseObject);  
  67.           
  68.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  69.         //失败  
  70.         NSLog(@"%@", error);  
  71.     }];  
  72. }  
  73.   
  74.   
  75. #pragma mark - GET请求 非JSON数据  
  76. - (void)dataGetRequest  
  77. {  
  78.     NSString * urlString = @"http://10.0.8.8/sns/my/user_list.php";  
  79.       
  80.     AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];  
  81.       
  82.     //设置请求的数据格式,设置为data,适用于任何格式,获取到数据之后是NSData格式,我们可以自己解析  
  83.     manager.responseSerializer = [AFHTTPResponseSerializer serializer];  
  84.       
  85.     [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  86.         //成功  
  87.         //responseObject装着数据,是NSData  
  88.         NSString * str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];  
  89.           
  90.         NSLog(@"%@", str);  
  91.           
  92.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  93.         NSLog(@"%@", error);  
  94.     }];  
  95. }  
  96.   
  97. #pragma mark - POST请求  
  98. - (void)postRequest  
  99. {  
  100.     NSString * url = @"http://localhost/cgi-bin/post1.cgi";  
  101.     //访问cgi-bin服务器,访问POST1.cgi程序  
  102.       
  103.     //创建单例对象  
  104.     AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];  
  105.       
  106.     //获取接收的回馈数据的类型,POST请求也会收到回馈  
  107.     manager.responseSerializer = [AFHTTPResponseSerializer serializer];  
  108.       
  109.     //post键值对  
  110.     NSDictionary * dict = @{@"username":@"Tom"@"password":@"123456"@"message":@"woooooooooow"};  
  111.       
  112.     //发送请求  
  113.     [manager POST:url parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  114.           
  115.         NSLog(@"成功!%@",[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);  
  116.           
  117.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  118.           
  119.         NSLog(@"失败%@", error);  
  120.           
  121.     }];  
  122.       
  123. }  
  124.   
  125. #pragma mark - 上传文件  
  126. - (void)uploadFile  
  127. {  
  128.     NSString * url = @"http://localhost/cgi-bin/post2.cgi";  
  129.       
  130.     AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];  
  131.       
  132.       
  133.     manager.responseSerializer = [AFHTTPResponseSerializer serializer];  
  134.       
  135.       
  136.     //发送数据  
  137.     [manager POST:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {  
  138.         //在这里将需要发送的数据,添加到formData对象  
  139.           
  140.         //找到图片  
  141.         NSString * imagePath = [[NSBundle mainBundle] pathForResource:@"annotation" ofType:@"png"];  
  142.           
  143.         //将图片转成data  
  144.         NSData * data = [NSData dataWithContentsOfFile:imagePath];  
  145.           
  146.         //将data传给formData  
  147.         [formData appendPartWithFileData:data name:@"image" fileName:@"annotation.png" mimeType:@"image/png"];  
  148.         //mimeType:@"image/png" @"text/html" @"text/json" @"text/xml" @"image/jpeg"等  
  149.           
  150.           
  151.     } success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  152.           
  153.         NSLog(@"成功");  
  154.           
  155.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  156.           
  157.         NSLog(@"失败");  
  158.           
  159.     }];  
  160. }  
  161.   
  162. #pragma mark - 文件下载  
  163. - (void)requestFile  
  164. {  
  165.     NSString * urlString = @"http://10.0.8.8/download/归档Archieve.pdf";  
  166.     //创建下载实用类  
  167.     AFURLSessionManager * manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];  
  168.     //参数是用来管理进度显示等kvo数据的  
  169.       
  170.     //因为路径存在中文,无法转成URL,需要转码  
  171.     urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
  172.       
  173.     NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];  
  174.       
  175.     //第一个参数是请求,第二个参数是进度对象指针的地址,为了返回进度  
  176.       
  177.     //__autoreleasing修饰传入地址的对象指针  
  178.     __autoreleasing NSProgress * progress = nil;  
  179.     //调用函数后,会自动创建一个progress对象,然后改变progress指针的值,让它指向这个对象  
  180.       
  181.     //返回一个下载任务  
  182.     NSURLSessionDownloadTask * task = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {  
  183.         //告诉下载管理器,文件存储的路径  
  184.         NSString * path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/视频.mp4"];  
  185.         return [NSURL fileURLWithPath:path];  
  186.           
  187.     } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {  
  188.         //下载完成的回调,可能正确可能错误  
  189.         if (error) {  
  190.             NSLog(@"%@", error);  
  191.         }  
  192.     }];  
  193.       
  194.     //启动下载任务  
  195.     [task resume];  
  196.       
  197.     _task = task;  
  198.       
  199.     NSLog(@"%@", NSHomeDirectory());  
  200.       
  201.     //得到了progress对向  
  202.     _progress = progress;  
  203.     //用成员变量指向,如同做了一个强引用,保证刚刚创建的progress对象不会在当前函数结束时消失  
  204.       
  205.     //设置观察者,观察进度  属性@"fractionCompleted"表示完成的进度  
  206.     [_progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:nil];  
  207. }  
  208.   
  209. //监控下载进度  
  210. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(voidvoid *)context  
  211. {  
  212.     if (object == _progress && [keyPath isEqualToString:@"fractionCompleted"] == YES) {  
  213.         //        NSLog(@"%f%%", [change[@"new"] doubleValue] * 100);  
  214.         NSLog(@"%.2f%%", _progress.fractionCompleted * 100);  
  215.     }  
  216. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值