AFN3.0以上版本的二次封装

基于AFN的二次封装 基于AFN的二次封装,比较轻量级,post和get于一体的封装。支持图片上传。 立即下载

先说一说项目中为什么需要使用AFNetworking,使用时又为什么需要封装

每一款APP的开发,都需要用到网络请求接口,如果使用iOS系统原生的NSURLConnection,既考验开发人员的技术功底(那得是技术相当滴硬,而且在这方面造诣也很高),又考验开发人员的忍耐力(不停地改,改,改),后期维护也需要大量耗费人力和时间。于是AFNetworking出世了(目前来说比较安全,比较专业,还免费),但是直接调用其API也不太好,无法做到整个项目的统一配置,最好的方式就是对网络层(AFNetworking)再封装一层,整个项目不允许直接使用 AFNetworking 的 API ,而是直接调用自己封装的网路层,这样网络请求需求都可以在这一层里配置好,使用者无须知道里面的代码逻辑,只管调用封装好的方法就可以实现对应需求。

封装优势:

  1. 降低项目中的耦合
  2. 统一配置,方便后期维护。

以下是几种常用的网络请求方式

Request_method的规则:
* GET:获取资源,不会改动资源
* POST:创建记录
* PATCH:改变资源状态或更新部分属性
* PUT:更新全部属性
* DELETE:删除资源

这里我们先看看几种不太常用的网络请求方式

pragma mark POST 上传图片
/**
 *  上传图片
 *  @param path           上传的地址---需要填写完整的url
 *  @param paramters      上传图片预留参数---视具体情况而定,可移除
 *  @param imageArray     上传的图片数组
 *  @param width          图片要被压缩到的宽度
 *  @param upLoadProgress 进度
 *  @param success        请求成功的回调
 *  @param failure        请求失败的回调
 */
+ (void)sendPOSTImageWithPath:(NSString *)path
                withParamters:(NSDictionary *)paramters
               withImageArray:(NSArray *)imageArray
              withtargetWidth:(CGFloat )width
                 withProgress:(void(^) (float progress))upLoadProgress
                      success:(void(^) (BOOL isSuccess, id responseObject))success
                      failure:(void(^) (NSError *error))failure {

    [[NetWorkingManager shareManager] POST:path parameters:paramters constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {

        NSUInteger i = 0 ;
        // 上传图片时,为了用户体验或是考虑到性能需要进行压缩
        for (UIImage * image in imageArray) {
            // 压缩图片,指定宽度(注释:imageCompressed:withdefineWidth:图片压缩的category)
            UIImage *  resizedImage =  [UIImage imageCompressed:image withdefineWidth:width];
            NSData * imgData = UIImageJPEGRepresentation(resizedImage, 0.5);
            // 拼接Data
            [formData appendPartWithFileData:imgData name:[NSString stringWithFormat:@"picflie%ld",(long)i] fileName:@"image.png" mimeType:@" image/jpeg"];
            i++;
        }
    } progress:^(NSProgress * _Nonnull uploadProgress) {

        NSLog(@"downLoadProcess = %@",uploadProgress);
        if (uploadProgress) upLoadProgress(uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        NSLog(@"responseObject = %@",responseObject);
        if (success)success(YES,responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        NSLog(@"error = %@",error);
        if (failure) failure(error);
    }];
}
pragma mark DOWNLOAD 文件下载
+ (void)requestDownLoadDataWithPath:(NSString *)path
                      withParamters:(NSDictionary *)paramters
                       withSavaPath:(NSString *)savePath
                       withProgress:(void(^) (float progress))downLoadProgress
                            success:(void(^) (BOOL isSuccess, id responseObject))success
                            failure:(void(^) (NSError *error))failure {

    [[NetWorkingManager shareManager] downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:path]] progress:^(NSProgress * _Nonnull downloadProgress) {

        NSLog(@"downLoadProcess = %@",downLoadProgress);
        if (downloadProgress)downLoadProgress(downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {

        return  [NSURL URLWithString:savePath];
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {

        if (error) failure(error);
    }];
}
pragma mark - 取消网络请求–指定请求
/**
 *  取消指定的url请求
 *  @param type 该请求的请求类型
 *  @param path 该请求的完整url
 */
+(void)cancelHttpRequestWithType:(NSString *)type WithPath:(NSString *)path {
    NSError * error;
    // 根据请求的类型 以及 请求的url创建一个NSMutableURLRequest---通过该url去匹配请求队列中是否有该url,如果有的话 那么就取消该请求
    NSString * urlToPeCanced = [[[[NetWorkingManager shareManager].requestSerializer requestWithMethod:type URLString:path parameters:nil error:&error] URL] path];
    for (NSOperation * operation in [NetWorkingManager shareManager].operationQueue.operations) {
        // 如果是请求队列
        if ([operation isKindOfClass:[NSURLSessionTask class]]) {
            // 请求的类型匹配
            BOOL hasMatchRequestType = [type isEqualToString:[[(NSURLSessionTask *)operation currentRequest] HTTPMethod]];
            // 请求的url匹配
            BOOL hasMatchRequestUrlString = [urlToPeCanced isEqualToString:[[[(NSURLSessionTask *)operation currentRequest] URL] path]];
            // 两项都匹配的话  取消该请求
            if (hasMatchRequestType&&hasMatchRequestUrlString) {
                [operation cancel];
            }
        }
    }
}

这里就不一一详细展示了,我把demo涉及到的方法名在下面代码片中列举一下,如果有你需要的可以根据下载地址下载demo(https://github.com/CitrusHan/AFNetWorking-.git)

#pragma mark - GET 请求网络数据
/**
 *  请求网络数据
 *
 *  @param path             请求的地址
 *  @param paramters        请求的参数
 *  @param downLoadProgress 进度
 *  @param success          请求成功的回调
 *  @param failure          请求失败的回调
 */
+ (void)requestGETDataWithPath:(NSString *)path
                 withParamters:(NSDictionary *)paramters
                  withProgress:(void(^) (float progress))downLoadProgress
                       success:(void(^) (BOOL isSuccess, id responseObject))success
                       failure:(void(^) (NSError *error))failure ;

#pragma mark - POST 传送网络数据
/**
 *  传送网络数据
 *
 *  @param path           请求的地址
 *  @param paramters      请求的参数
 *  @param uploadProgress 进度
 *  @param success        请求成功的回调
 *  @param failure        请求失败的回调
 */
+ (void)sendPOSTDataWithPath:(NSString *)path
               withParamters:(NSDictionary *)paramters
                withProgress:(void(^) (float progress))upLoadProgress
                     success:(void(^) (BOOL isSuccess, id responseObject))success
                     failure:(void(^) (NSError *error))failure ;

#pragma mark POST 上传图片
/**
 *  上传图片
 *
 *  @param path           上传的地址--需要填写完整的url
 *  @param paramters      上传图片预留参数--根据具体需求而定,可以出
 *  @param imageArray     上传的图片数组
 *  @param width          图片要被压缩到的宽度
 *  @param upLoadProgress 进度
 *  @param success        请求成功的回调
 *  @param failure        请求失败的回调
 */
+ (void)sendPOSTImageWithPath:(NSString *)path
               withParamters:(NSDictionary *)paramters
              withImageArray:(NSArray *)imageArray
             withtargetWidth:(CGFloat )width
                withProgress:(void(^) (float progress))upLoadProgress
                     success:(void(^) (BOOL isSuccess, id responseObject))success
                     failure:(void(^) (NSError *error))failure ;

#pragma mark POST 上传视频
/**
 *  上传视频
 *
 *  @param path           上传的地址--需要填写完整的url
 *  @param videoPath      上传的视频--本地沙盒的路径
 *  @param paramters      上传视频预留参数--根据具体需求而定,可以出
 *  @param upLoadProgress 进度
 *  @param success        请求成功的回调
 *  @param failure        请求失败的回调
 */
+ (void)sendPOSTImageWithPath:(NSString *)path
                withVideoPath:(NSString *)videoPath
                withParamters:(NSDictionary *)paramters
                 withProgress:(void(^) (float progress))upLoadProgress
                      success:(void(^) (BOOL isSuccess, id responseObject))success
                      failure:(void(^) (NSError *error))failure ;

#pragma mark DOWNLOAD 文件下载
+ (void)requestDownLoadDataWithPath:(NSString *)path
                      withParamters:(NSDictionary *)paramters
                       withSavaPath:(NSString *)savePath
                       withProgress:(void(^) (float progress))downLoadProgress
                            success:(void(^) (BOOL isSuccess, id responseObject))success
                            failure:(void(^) (NSError *error))failure ;

#pragma mark - DELETE 删除资源
+ (void)requestDELETEDataWithPath:(NSString *)path
                    withParamters:(NSDictionary *)paramters
                          success:(void (^) (BOOL isSuccess, id responseObject))success
                          failure:(void (^) (NSError *error))failure ;

#pragma mark - PUT 更新全部属性
+ (void)sendPUTDataWithPath:(NSString *)path
              withParamters:(NSDictionary *)paramters
                    success:(void(^) (BOOL isSuccess, id responseObject))success
                    failure:(void(^) (NSError *error))failure ;

#pragma  mark - PATCH 改变资源状态或更新部分属性
+ (void)sendPATCHDataWithPath:(NSString *)path
                withParamters:(NSDictionary *)paramters
                      success:(void (^) (BOOL isSuccess, id responseObject))success
                      failure:(void (^) (NSError *error))failure ;

#pragma mark - 取消网络请求--全部请求
+ (void)cancelAllNetworkRequest ;

#pragma mark - 取消网络请求--指定请求
/**
 *  取消指定的url请求
 *
 *  @param type 该请求的请求类型
 *  @param path 该请求的完整url
 */
+(void)cancelHttpRequestWithType:(NSString *)type WithPath:(NSString *)path ;

在这个demo里面我大概封装了10中网络请求方式,其中有3-4种方式是大家常用的,其余的是可能会遇到的,总地来说看看是没有损失的。这10种方式有的是我在项目中用到过的,有的是我借鉴网上的资源,如有不足的地方希望你可以提出来我们探讨,最好在github上给我提一个PR。

ios AFN的二次封装 ios 基于AFN的二次封装修正版。仅供参考。 立即下载

相关推荐

从零组装电赛送药小车:OpenMV视觉核心+STM32控制,我的软硬件联调全记录

本文详细记录了从零构建电赛智能送药小车的全过程,重点解析了OpenMV视觉识别与STM32控制的深度协同方案。通过硬件选型对比、通信协议设计、PID调参等实战经验,解决了巡线精度、十字路口识别等核心问题,最终实现稳定可靠的送药小车系统,助力电子设计竞赛取得优异成绩。

weixin_42641741的博客 447

AFNetworking二次封装

#import &lt;Foundation/Foundation.h&gt;#import &lt;UIKit/UIKit.h&gt;#import "AFNetworking.h"@interface AFCNetFaliedModel : NSObject@property(nonatomic,assign)  NSInteger code;@property(nonatomic,copy)...

芷江的博客 1078

线性代数笔记【空间曲面】

二次曲面 曲面可以看成是一个动点或一条动曲线按照一定条件或规律运动产生的轨迹 曲面的方程即是该动点的坐标所满足的方程 空间解析几何中,一般会涉及到由曲面写方程和由方程看曲面两种类型问题 曲面与曲面方程 球面方程 球面:空间内与定点的距离等于定长的点的集合 这一定点叫球心,定长叫半径 标准方程 (x−x0)2+(y−y0)2+(z−z0)2=r2(x-x_0)^2+(y-y_0)^2+(z-z_0)^2=r^2(x−x0​)2+(y−y0​)2+(z−z0​)2=r2 球心P0(x0,y0,z0)P_0(

qq_40500005的博客 3246

AFNetworking3.1 二次封装

@interface BJAppClient : AFHTTPSessionManager + (instancetype)sharedClient; @end static NSString * const APIBaseURLString = @"xxxxx"; @implementation BJAppClient + (instancetype)sharedClient {

heberan的专栏 7550

无网环境也能玩转DBeaver?手把手教你离线安装与ClickHouse连接(附实测jar包)

本文详细介绍了在无网环境下如何离线安装DBeaver并配置ClickHouse连接的完整指南。通过准备必备工具如DBeaver安装包、ClickHouse JDBC驱动及Maven本地仓库,确保在物理隔离环境中实现数据库管理。文章包含详细的安装步骤、驱动配置和性能优化建议,帮助开发者在严格网络限制下高效工作。

weixin_42635064的博客 375

分析国外几款主流蜜罐产品看欺骗诱捕技术的应用脉络

网络安全的本质是攻防对抗,更本质的其实是人与人心智与技术的全面较量。 欺骗诱捕技术作为攻防对抗技术中比较特殊的技术,能够使防守方更多掌握对抗中的主动权,诱导攻击,迫使攻击者耗费精力的同时,留下丰富的攻击信息。究其本质,欺骗诱捕技术更深层次考验的不止是技术的能力,还有对于攻击者作为人的理解。 国外主流蜜罐产品分析 根据MarketsandMarkets《欺骗技术市场规模、份额和2021年全球市场预测》中提到的欺骗诱捕技术全球主要供应商及产品,我们分析了几款国外主流的蜜罐产品,希望更清晰看到欺骗诱捕技术应

cdyunaq的博客 1309

保研考研复试英语自我介绍:从模板背诵到对话引导的策略

在研究生复试等关键面试场景中,自我介绍是展示个人能力与潜力的重要环节。其核心原理在于通过结构化叙事,高效传递个人价值,引导面试官关注自身优势领域。从技术价值看,一个精心设计的自我介绍不仅是语言能力的体现,更是逻辑思维、自我认知与目标匹配度的综合展示。在应用场景上,它适用于保研、考研复试、求职、学术交流等多种需要快速建立专业印象的场合。本文聚焦于英语自我介绍,深入剖析如何将通用模板转化为个性化的对话引导工具,特别强调通过故事化包装和STAR原则来构建有说服力的个人叙事,并提供了从一分钟到三分钟不同时长的结构化

a359798678的博客 457

强化学习 之 Actor Critic

简介 Actor Critic是一种结合体算法: (1)Actor 的前生是 Policy Gradients,这能让它毫不费力地在连续动作中选取合适的动作,而 Q-learning 做这件事会瘫痪; (2)Critic 的前生是 Q-learning 或者其他的 以值为基础的学习法,能进行单步更新,而传统的 Policy Gradients 则是回合更新,这降低了学习效率。 算法思想 Actor...

Test_tju的博客 811

iOS_SN_基于AFNetworking3.0网络封装

转发文章,原地址:http://www.henishuo.com/base-on-afnetworking3-0-wrapper/?utm_source=tuicool&utm_medium=referral 前言 对于开发人员来说,学习网络层知识是必备的,任何一款App的开发,都需要到网络请求接口。很多朋友都还在使用原生的NSURLConnection一行一行地写,代码到...

weixin_30341735的博客 207

让 ABAP Screen Variant 安稳上车:SHD0 与 SHD0_MANDT 的 Transport 全攻略

摘要: SAP项目常需优化交易码界面,通过SHD0的Transaction Variant和Screen Variant可实现字段精简、默认值预设及权限控制,避免修改标准代码。但跨系统迁移时易出现变式丢失或版本兼容问题。核心概念包括: Screen Variant:针对单个屏幕的字段属性配置(跨Client); Transaction Variant:串联多屏幕变式(分跨Client和Client-specific); 版本差异:4.70/6.x后需区分SHD0(跨Client)与SHD0_MANDT(Cl

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 226

RT-Thread littefs控制GD32F4xx片内Flash

GD32F4xx RT-Thread下使用littefs 控制片内flash 调试记录

madao1234的博客 995

iOS开发对AFNetworking3.0的二次封装

iOS开发对AFNetworking3.0的二次封装

moses的博客 6131

cartographer如何使用2个反光柱子作为一个landmark

2个反光柱的摆放要求:靠着墙摆,因为我们只能从一侧看到2个反光柱,从两侧都看到至少需要3个反光柱来定位。 landmark检测原理:因为我们是从一侧看到2个反光柱,所以看到2个反光柱在一帧激光数据中会有顺序,有2种情形,如下图 这两种情形,我们发现 情形1: 这种情形2个反光柱子被检测到的激光角度小于180,我们认为大一些激光角度的是原点。 情形2: 这种情形2个反光柱子被检测到的激光角度大于180,我们认为小一些激光角度的是原点。 这样原点就固定下来,并是唯一的。2个反光柱构成的坐标系也就确定了。和激光坐

南北粉面馆 3827

iOS程序猿之AFNetworking 3.0 版本使用

AFNetworking 3.0 版本使用 在Xcode7.0之后,苹果废弃了NSURLConnection方法,数据请求使用NSURLSession,作为网络请求类第三方库使用量最大的AFN也及时的更新的新的版本——AFN 3.0版本。新的版本的里废弃了基于NSURLConnection封装的AFHTTPRequestOperationManager,转而使用基于NSURLSession封装的

iOS_wq的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

AFN3.0源码解析

目录结构 NSURLSession 这个目录是封装了http请求需要的代码,其中AFURLSessionManager类主要处理http请求,AFHTTPSessionManager类是对其进行封装留给用户调用的上层接口。比如我们平时的get,post请求就要用到该类,也是本文要分析的重点。 Reachability 这个目录是判断网络状态的 Security https请求 S...

qq_17190231的博客 444

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

AFN小结(简单的封装)

AFN小结 1,AFN概念、原理 2,AFN的封装使用 3,AFN与其它框架对比 ————————————————————————————————— 1 , AFN的概念原理: AFN的基础是NSURL,AFN的直接操作对象AFHTTPClient是一个实现了NSCoding和NSCopying协议的NSObject子类。AFHTTPClient...

CCEN8569的博客 297

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

AFN的简单封装

前记 最近在隔壁的小组有一个项目,由于好久没有学习iOS,所有想乘机温习下功课,然后就主动请缨,帮助他们一起写项目,因为这个项目是有网络请求的(话说都有吧)然后觉得之前用的学长的一些网络请求有点不是很理解,然后就想自己也来封装一个(其实就是想装逼么。。。)好废话不多说 开整。 前提 这个封装是基于AFN(iOS网络请求最好的框架)用的AFN3.0。其实就是感觉就是将复杂重复的代码提取到了...

Sharker的博客 540

AFN二次封装

前言 对于开发人员来说,学习网络层知识是必备的,任何一款App的开发,都需要到网络请求接口。很多朋友都还在使用原生的NSURLConnection一行一行地写,代码到处是,这样维护起来更困难了。 对于使用AFNetworking的朋友来说,很多朋友都是直接调用AFNetworking的API,这样不太好,无法做到全工程统一配置。 最好的方式就是对网络层再封装一层,全工程不允许直接使用AFNe

为者常成,行者常至 3784

iOS - 简述二次封装AFN,设置请求头,https安全策略

以前都是直接复制粘贴二次封装好的代码 , 现在都忘了怎么写 . 恰好当前项目要用到请求头 , 在网上学习了一下 , 统一敲了一遍 .自从到了现在公司 , 才发现要学的东西太多了 , 当然 , 有个好的老大比什么都重要… 能学到不少的东西…创建两个类 , 一个类用于封装AFN , 一个类用作返回值模型 response模型类#import <Foundation/Foundation.h>@inter

coderMy的博客 2632

面试总结 - AFN

AFN调用流程分析: AFHTTPSessionManager: 发起网络请求(例如GET); AFHTTPSessionManager内部调用dataTaskWithHTTPMethod:方法(内部处理requestSerializer); dataTaskWithHTTPMethod内部调用父类AFURLSessionManager的dataTaskWithRequest: uploadPro...

宋卓的博客 535

AFN小记

一、AFN和ASI的区别ASI的使用参照文顶顶的http://www.cnblogs.com/wendingding/p/3950027.html1.底层实现1> AFN的底层基于OC的NSURLConnection和NSURLSession2> ASI的底层基于纯C语言的CFNetwork框架3> ASI的运行性能 高于 AFN2.对服务器返回的数据处理 1&gt...

dkaq53672的博客 264

网络请求之基于AFN的二次封装从AFN1.0升级到3.0后)

第一部分,基于AFN3.0进行二次封装,法相3.0的请求速度要高于1.0的。其中多个接口异步发起请求主要是用到了调度组。自行使用pod去集成AFN.如果不会的可以去网上查看资料,太多了,就不再赘述了,直接上代码。#import &lt;UIKit/UIKit.h&gt; @class AFHTTPRequestOperation; @interface HTTPTool : NSObject ...

fangcengceng的博客 376

AFNetworking3.0以上版本的封装--封装代码(升级版)

这之前写过一篇《AFN3.0以上版本的二次封装》,主要为当时公司的项目服务,写的针对性比较强。做过几个不同的项目后,对网络请求的理解更加清晰了,因此写下了这篇升级版。之前那篇文章写过的一些细下模块,这里就不做太多的重复介绍了,这里主要写下大众适用模块。封装AFN目的:1、降低工程代码耦合度,提高网络请求的内聚度。(比较官方的说法,主要是直接使用显得太low) 2、降低代码工作量,统一管理调用。(懒

Jane's Blog 3050

AFNetworking 3.0 版本使用

AFNetworking 3.0 版本使用 在Xcode7.0之后,苹果废弃了NSURLConnection方法,数据请求使用NSURLSession,作为网络请求类第三方库使用量最大的AFN也及时的更新的新的版本——AFN 3.0版本。新的版本的里废弃了基于NSURLConnection封装的AFHTTPRequestOperationManager,转而使用基于NSURLSession封

YPJin的博客 1万+

(iOS-框架封装)AFN3.x 网络请求封装

AFNetworking 我项目里面的网络请求是一外包大牛基于AFN2.x封装的基本网络请求,感觉其封装的贼好,对服务端返回的错误码统一处理,对返回的 json 数据下发给每个继承自基本网络请求的 子网络请求 自己处理自己的数据,但是缺点就是AFN框架太老,不适合其他人使用。所以。。。 先瞅瞅效果哈~ 网络请求 基于AFN3.x核心类AFURLSessionMan

沐雨07的专栏 3965

Swift3.0 + AFN3.0 + MJExtention + (泛型)封装网络请求类

写在前面:对于移动端开发来说,无论iOS,Android,抑或是H5开发,所谓的开发核心之一就是从服务端接收数据,前端负责展示,所以,当然还有各种逻辑的实现,但是呢,一个完善的APP肯定是少不了与服务端交互的,所以一个网络请求类的封装好用与否直接关系到一个项目的开发效率以及后期的维护,本人也接手过那种没有请求类的项目呢,每个请求写了一堆代码,用的全部是ASI,,然后需要更改为AFN的时候,哇,简直无

NeoWorld 737
上一篇: iOS设置[self.navigationItem setTitleView:View]
下一篇: iOS生成随机数
黑萝卜不黑
博客等级 码龄11年 41粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值