• 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

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

    起风了,唯有努力生存

  • 相关阅读:
    【Oracle】导入导出操作
    高德交通态势地址
    UML类图Java
    【SQL】数据库模糊查询
    【数据库】Java中数据库连接池原理机制的详细讲解
    随笔-使用时间管理有感
    【structs2】>>> FilterDispatcher <<< is deprecated!
    【算法】排序算法之插入排序
    【CSS】命名规范
    【JQuery】15个值得开发人员关注的jQuery开发技巧和心得
  • 原文地址:https://www.cnblogs.com/aurorasw/p/13191405.html
Copyright © 2020-2023  润新知