zoukankan      html  css  js  c++  java
  • iOS开发--AFN框架基本使用

    iOS开发--AFN框架基本使用

    技术概述

    AFNetworking是目前国内开发网络应用使用最多的第三方框架,专为 Mac OS & iOS 设计的一套网络框架,对 NSURLConnection 和 NSURLSession 做了封装,提供有丰富的 API,同时提供了完善的错误解决方案,使用简单。

    技术详述

    使用案例

    我在此次团队开发项目中使用AFNetworking请求后端接口,给后端发送数据,图片文件。
    例如访问新增日记的接口:
    图1
    图2

    步骤

    1.创建会话管理者manager

    2.发送POST/GET请求

    第一个参数:请求路径(不包含参数).NSString

    第二个参数:字典(发送给服务器的数据~参数)

    第三个参数:constructingBodyWithBlock 处理要上传的文件数据

    第四个参数:progress 进度回调

    第五个参数:success 成功回调

    responseObject:响应体信息(JSON--->OC对象)

    第六个参数:failure 失败回调

    error:错误信息

    数据格式

    • 请求数据格式:AFURLRequestSerialization
    类型 说明
    AFHTTPRequestSerializer 二进制的,默认的
    AFJSONRequestSerializer JSON(POST JSON) RESTful 设计风格需要
    AFPropertyListRequestSerializer PList(POST Plist-开发中几乎不用)
    • 响应数据格式:AFURLResponseSerialization
    类型 说明
    AFHTTPResponseSerializer HTTP 二进制的
    AFJSONResponseSerializer JSON 默认的
    AFXMLParserResponseSerializer XML Parser 解析器 SAX 解析

    常见功能

    • 发送GET/POST请求

      NSDictionary *dic1=@{
                                                                                    @"phone":_phone, @"username":alert.textFields[0].text
                                                                                    };
                                                               AFHTTPSessionManager *manager1=[AFHTTPSessionManager manager];
                                                               manager1.requestSerializer = [AFJSONRequestSerializer serializer];
                                                               manager1.responseSerializer = [AFHTTPResponseSerializer serializer];
                                                               [manager1 POST:@"http://localhost:8080/OneDay/user/username" parameters:dic1 progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                                                                   NSLog(@"%@",responseObject);
                                                                   [[NSUserDefaults standardUserDefaults] setObject:alert.textFields[0].text forKey:@"username"];
                                                                   _username=alert.textFields[0].text;
                                                                   [[NSUserDefaults standardUserDefaults] synchronize];
                                                                   [self.tableview reloadData];
                                                                   
                                                               } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                                                                   NSError *err=error;
                                                                   NSLog(@"%@",err);
                                                                   UIAlertController *alert=[UIAlertController alertControllerWithTitle:@"提示" message:@"修改昵称失败" preferredStyle:UIAlertControllerStyleAlert];
                                                                   [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]];
                                                                   [self presentViewController:alert animated:YES completion:nil];
                                                               }];
      
    • 下载/上传文件
      上传图片:

    	 AFHTTPSessionManager *manager=[AFHTTPSessionManager manager];
        
        manager.requestSerializer = [AFHTTPRequestSerializer serializer];
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        [manager POST:@"http://localhost:8080/OneDay/user/profilePhoto" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData)
        {
            NSData *data1=[_phone  dataUsingEncoding:NSUTF8StringEncoding];
            [formData appendPartWithFormData:data1 name:@"phone"];
            NSData *data=UIImageJPEGRepresentation(image, 0.7);
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
            formatter.dateFormat = @"yyyyMMddHHmmss";
            NSString *str = [formatter stringFromDate:[NSDate date]];
            NSString *fileName = [NSString stringWithFormat:@"%@.jpg", str];
            //上传文件参数
            [formData appendPartWithFileData:data name:@"photo" fileName:fileName mimeType:@"image/jpeg"];
            
        } progress:^(NSProgress * _Nonnull uploadProgress) {
            //打印上传进度
            CGFloat progress = 100.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount;
            NSLog(@"%.2lf%%", progress);
            
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
            //成功之后修改phone
            NSDictionary *dic1=@{
             @"phone":_phone,
             @"password":_password,
             };
            AFHTTPSessionManager *manager1=[AFHTTPSessionManager manager];
            manager1.requestSerializer = [AFJSONRequestSerializer serializer];
            manager1.responseSerializer = [AFJSONResponseSerializer serializer];
             [manager1 POST:@"http://localhost:8080/OneDay/user/login" parameters:dic1 progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
             NSDictionary *nsdic=responseObject;
             NSLog(@"%@",nsdic);
                 [[NSUserDefaults standardUserDefaults] setObject:[nsdic objectForKey:@"photo"] forKey:@"photo"];
                 [[NSUserDefaults standardUserDefaults] synchronize];
    
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                 NSError *err=error;
                 NSLog(@"%@",err);
    
                 }];
            NSLog(@"请求成功:%@",responseObject);
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
            //请求失败
            NSLog(@"请求失败:%@",error);
            
        }];	
    

    附加功能

    • 安全策略
      • HTTPS
      • AFSecurityPolicy
    • 网络检测
      • 对苹果的网络连接检测做了一个封装
      • AFNetworkReachabilityManager
    	//创建一个单例manager
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
    //监测网络状态改变
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    switch (status) {
    case AFNetworkReachabilityStatusUnknown:
    NSLog(@"没有网络");
    break;
    case AFNetworkReachabilityStatusNotReachable:
    NSLog(@"连接到路由器网络不能到达");
    break;
    case AFNetworkReachabilityStatusReachableViaWWAN:
    NSLog(@"2G/3G/4G");
    break;
    case AFNetworkReachabilityStatusReachableViaWiFi:
    NSLog(@"wifi");
    break;
    }
    }];
    //开启检测
    [manager startMonitoring];
    

    技术使用中遇到的问题

    • 3840报错
      图3
    • 1016报错
      在进行网络请求时出现-1016 是因为只支持text/json,application/json,text/javascript你可以添加text/html或其他
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"application/json",nil];
    

    总结

    AFNetworking是iOS开发中常使用的框架,一个构建在 NSURLConnection、NSOperation 以及其他熟悉的 Founation 技术之上的一个第三方网络框架,主要使用在发送网络请求以及实时监测网络状态的两个场景中,对网络请求部分做了很好的封装,并且拥有良好的架构,丰富的api,以及模块化构建方式,使用起来非常轻松,post和get请求管理类定义api完全相同。

    参考博客1

    参考博客2

    作者:sw

    -------------------------------------------

    起风了,唯有努力生存

  • 相关阅读:
    HDU 5213 分块 容斥
    HDU 2298 三分
    HDU 5144 三分
    HDU 5145 分块 莫队
    HDU 3938 并查集
    HDU 3926 并查集 图同构简单判断 STL
    POJ 2431 优先队列
    HDU 1811 拓扑排序 并查集
    HDU 2685 GCD推导
    HDU 4496 并查集 逆向思维
  • 原文地址:https://www.cnblogs.com/aurorasw/p/13191405.html
Copyright © 2011-2022 走看看