zoukankan      html  css  js  c++  java
  • [iOS 多线程 & 网络

    [iOS 多线程 & 网络 - 4.0] - AFN框架简单使用

    A.AFN基本知识 1.概念

    • AFNetworking
    • 是对NSURLConnection的封装
    • 运行效率没有ASI高(因为ASI基于CFNetwork),但是使用简单
    • AFN支持ARC

        B.基本请求使用 1.基本使用 (1)头文件 AFNetworking.h (2)管理者类:AFHTTPRequestOperationManager (3)“GET”方法发送GET请求,使用“POST”方法发送POST请求 (4)使用字典发送参数 (5)block处理请求成功/失败  

     1 /** 发送 GET/POST 请求 */
     2 - (void) sendNormalRequest {
     3     // 1.创建请求 管理者
     4     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
     5    
     6     // 2.设置参数
     7     NSMutableDictionary *param = [NSMutableDictionary dictionary];
     8     param[@"user"] = @"tom";
     9     param[@"password"] = @"123";
    10    
    11     // 3.发送请求
    12 //    // 3.1 GET请求
    13 //    [manager GET:@"http://192.168.0.21:8080/MyTestServer/login" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
    14 //        NSLog(@"请求成功");
    15 //        NSLog(@"%@", responseObject);
    16 //    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    17 //        NSLog(@"请求失败");
    18 //        NSLog(@"%@", error);
    19 //    }];
    20    
    21     // 3.2 POST请求
    22     [manager POST:@"http://192.168.0.21:8080/MyTestServer/login" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
    23         NSLog(@"请求成功");
    24         NSLog(@"%@", responseObject);
    25     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    26         NSLog(@"请求失败");
    27         NSLog(@"%@", error);
    28     }];
    29 }

      2.为了方便查看服务器返回的中文数据,给数组和字典增加一个分类,支持中文

     1 #import <Foundation/Foundation.h>
     2 
     3 @implementation NSDictionary (Log)
     4 
     5 /** 本地化显示 */
     6 - (NSString *)descriptionWithLocale:(id)locale {
     7     NSMutableString *str = [NSMutableString string];
     8    
     9     [str appendString:@"{
    "];
    10    
    11     // 遍历字典
    12     [self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    13         [str appendFormat:@"	%@ = %@,
    ", key, obj];
    14     }];
    15    
    16     [str appendString:@"}"];
    17    
    18     // 取出最后一个“,”
    19     NSRange range = [str rangeOfString:@"," options:NSBackwardsSearch];
    20     [str deleteCharactersInRange:range];
    21    
    22     return str;
    23 }
    24 
    25 @end
    26 
    27 @implementation NSArray (Log)
    28 
    29 - (NSString *)descriptionWithLocale:(id)locale {
    30     NSMutableString *str = [NSMutableString string];
    31    
    32     [str appendString:@"[
    "];
    33    
    34     // 遍历数组所有元素
    35     [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    36         [str appendFormat:@"%@, 
    ", obj];
    37     }];
    38    
    39     [str appendString:@"]"];
    40    
    41     return str;
    42 }
    43 
    44 @end

        3.解析返回的json数据

    • AFHTTPRequestOperationManager 依靠设置序列化器来自动识别、解析返回的数据
    • 默认使用的就是json解析,可以不用设置序列化器
    • 会把json自动转换成为字典或者数组输出
     1 /** 返回json数据 */
     2 - (void) getJson {
     3     // 1.创建请求 管理者
     4     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
     5    
     6     // 设置序列化器
     7 //    [manager setResponseSerializer:[AFJSONResponseSerializer serializer]];//默认
     8  
     9     // 2.设置参数
    10     NSMutableDictionary *param = [NSMutableDictionary dictionary];
    11     param[@"type"] = @"json";
    12    
    13     // 3.发送请求
    14     [manager GET:@"http://192.168.0.21:8080/MyTestServer/video" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
    15         NSLog(@"请求成功");
    16         NSLog(@"返回的数据类型是:%@", [responseObject class]);
    17         NSLog(@"%@", responseObject);
    18     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    19         NSLog(@"请求失败");
    20         NSLog(@"%@", error);
    21     }];
    22 }

      output: 2015-01-30 03:34:14.817 AFNBasicDemo[1889:192783] 请求成功
    2015-01-30 03:34:14.817 AFNBasicDemo[1889:192783]
     返回的数据类型是:__NSCFDictionary
    2015-01-30 03:34:14.818 AFNBasicDemo[1889:192783] {
    videos = [
    {
    name =
     驯龙高手1,
    video = videos/1.MP4,
    length = 16
    ,
    image = images/[20150124-180852-0].PNG
     }, ...     4.解析返回的xml数据 设置使用xml序列化器,也可以自动将xml数据转换成为字典或者数组 如果不设置xml序列化器,处理返回数据会失败  

     1 /** 返回xml数据 */
     2 - (void) getXml{
     3     // 1.创建请求 管理者
     4     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
     5    
     6     // 设置序列化器
     7     [manager setResponseSerializer:[AFXMLParserResponseSerializer serializer]];
     8    
     9     // 2.设置参数
    10     NSMutableDictionary *param = [NSMutableDictionary dictionary];
    11     param[@"type"] = @"xml";
    12    
    13    
    14     // 3.发送请求
    15     __weak typeof(self) vc = self;
    16     [manager GET:@"http://192.168.0.21:8080/MyTestServer/video" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
    17         NSLog(@"请求成功");
    18         NSLog(@"返回的数据类型是:%@", [responseObject class]);
    19        
    20         NSXMLParser *parser = (NSXMLParser *) responseObject;
    21         parser.delegate = vc;
    22         [parser parse];
    23     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    24         NSLog(@"请求失败");
    25         NSLog(@"%@", error);
    26     }];
    27 }

        C.文件下载/上传 1.文件下载

    • 也是简单发送请求
    • 但是没有ASI那样的监听功能
     1 - (void) downloadFile {
     2     // 1.创建请求管理者
     3     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
     4    
     5     // 设置序列化器
     6     [manager setResponseSerializer:[AFHTTPResponseSerializer serializer]]; // 使用二进制数据序列化
     7    
     8     // 3.发送请求
     9     [manager GET:@"http://192.168.0.21:8080/MyTestServer/images/images.zip" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    10        
    11         NSLog(@"请求成功");
    12         NSLog(@"返回的数据类型是:%@", [responseObject class]);
    13        
    14         NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    15         NSString *filePath = [cachePath stringByAppendingPathComponent:@"download.zip"];
    16         NSData *data = (NSData *) responseObject;
    17         [data writeToFile:filePath atomically:YES];
    18        
    19     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    20         NSLog(@"请求失败");
    21         NSLog(@"%@", error);
    22     }];
    23 }

        2.文件上传

    • 使用POST请求,带formData的post方法
    • 要区分普通参数和文件参数,把文件数据放在普通参数中上传是不行的
    • 文件放在block参数中赋值

    (1)把文件转换成二进制数据 (2)拼接文件参数  

     1 /** 上传文件 */
     2 - (void) uploadFile {
     3     // 1.创建请求管理者
     4     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
     5    
     6     // 2.设置参数
     7     NSMutableDictionary *param = [NSMutableDictionary dictionary];
     8     param[@"user"] = @"uploader";
     9    
    10     // 3.设置上传文件
    11     NSString *filePath = [[NSBundle mainBundle] pathForResource:@"M2.jpg" ofType:nil];
    12     NSData *fileData = [NSData dataWithContentsOfFile:filePath];
    13    
    14     // 4.上传文件
    15     __weak typeof(fileData) uploadData = fileData;
    16    
    17     [manager POST:@"http://192.168.0.21:8080/MyTestServer/upload" parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    18        
    19         // 拼接文件数据
    20         [formData appendPartWithFileData:uploadData name:@"uploadedFile" fileName:@"my_pic.jpg" mimeType:@"image/jpg"];
    21        
    22     } success:^(AFHTTPRequestOperation *operation, id responseObject) {
    23         NSLog(@"上传成功 ---- %@", responseObject);
    24     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    25         NSLog(@"上传失败 ---- %@", error);
    26     }];
    27 }

        D.网络状态监控 AFNetworkReachabilityManager (1)创建网络监控管理者 (2)设置监控网络状态变化 (3)开启监控 (4)也可以主动去获取网络状态  

     1 - (IBAction)monitorNetwork:(UIButton *)sender {
     2     // 1.创建网络状态监控管理者
     3     AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
     4    
     5     // 2.网络状态改变事件(被动检测)
     6     [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
     7         switch (status) {
     8             case AFNetworkReachabilityStatusUnknown:
     9                 NSLog(@"转换为未知网络");
    10                 break;
    11             case AFNetworkReachabilityStatusReachableViaWWAN:
    12                 NSLog(@"转换为手机网络");
    13                 break;
    14             case AFNetworkReachabilityStatusReachableViaWiFi:
    15                 NSLog(@"转换为WIFI网络");
    16                 break;
    17             case AFNetworkReachabilityStatusNotReachable:
    18                 NSLog(@"转换为没有网络");
    19                 break;
    20                
    21             default:
    22                 break;
    23         }
    24     }];
    25    
    26     // 开启监控
    27     [manager startMonitoring];
    28    
    29     // 主动检测
    30     if ([manager isReachable]) {
    31         NSLog(@"现在有网络");
    32     } else if ([manager isReachableViaWiFi]) {
    33         NSLog(@"现在是通过wifi上网");
    34     } else if ([manager isReachableViaWWAN]) {
    35         NSLog(@"现在是通过手机网络上网");
    36     } else {
    37         NSLog(@"现在没有网络");
    38     }
    39 }
  • 相关阅读:
    English,The Da Vinci Code, Chapter 23
    python,meatobject
    English,The Da Vinci Code, Chapter 22
    English,The Da Vinci Code, Chapter 21
    English,The Da Vinci Code, Chapter 20
    English,The Da Vinci Code, Chapter 19
    python,xml,ELement Tree
    English,The Da Vinci Code, Chapter 18
    English,The Da Vinci Code, Chapter 17
    English,The Da Vinci Code, Chapter 16
  • 原文地址:https://www.cnblogs.com/YangFuShun/p/4505682.html
Copyright © 2011-2022 走看看