Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS网络——AFNetworking AFHttpSessionManager源码解析

iOS网络——AFNetworking AFHttpSessionManager源码解析

作者头像
WWWWDotPNG
发布于 2018-04-10 04:12:21
发布于 2018-04-10 04:12:21
1.6K00
代码可运行
举报
文章被收录于专栏:iOS技术杂谈iOS技术杂谈
运行总次数:0
代码可运行

你要知道的NSURLSession都在这里

转载请注明出处 https://cloud.tencent.com/developer/user/1605429

本系列文章主要讲解iOS中网络请求类NSURLSession的使用方法进行详解,同时也会以此为扩展,讲解SDWebImage中图片下载功能的源码分析,讲解AFNetworking相关源码分析。本系列文章主要分为以下几篇进行讲解,读者可按需查阅。

  • iOS网络——NSURLSession详解及SDWebImage源码解析
  • iOS网络——SDWebImage SDImageDownloader源码解析
  • iOS网络——AFNetworking AFURLSessionManager源码解析
  • iOS网络——AFNetworking AFHttpSessionManager源码解析

AFNetworking AFHTTPSessionManager源码解析

前一篇文章我们讲解了AFURLSessionManager的源码,最后还给了一个只使用AFURLSessionManager来创建NSURLSessionDataTaskNSURLSessionDownloadTask的栗子,但是发现创建下载任务真的很简单了,只需要传入要下载文件的NSURL对象,在传入几个回调块就能将文件下载到指定的目录中,并且可以监控下载进度,真的很方便,但NSURLSessionDataTask创建的任务默认是GET请求,如果需要其他如POST请求还需要修改request就显得有些麻烦了,今天要介绍的AFHTTPSessionManager就是继承自AFURLSessionManager,通过名称就知道这个类为HTTP访问提供了更加便捷的方法。

直接看头文件的声明源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//继承自AFURLSessionManager类
@interface AFHTTPSessionManager : AFURLSessionManager <NSSecureCoding, NSCopying>

//网络请求要访问的URL
@property (readonly, nonatomic, strong, nullable) NSURL *baseURL;

//请求序列化
@property (nonatomic, strong) AFHTTPRequestSerializer <AFURLRequestSerialization> * requestSerializer;

//响应序列化
@property (nonatomic, strong) AFHTTPResponseSerializer <AFURLResponseSerialization> * responseSerializer;

///-------------------------------
/// @name Managing Security Policy
///-------------------------------

//安全策略
@property (nonatomic, strong) AFSecurityPolicy *securityPolicy;

///---------------------
/// @name Initialization
///---------------------

//类方法返回一个AFHTTPSessionManager对象,不是单例,每次调用都重新创建
+ (instancetype)manager;

//构造函数
- (instancetype)initWithBaseURL:(nullable NSURL *)url;

//构造函数
- (instancetype)initWithBaseURL:(nullable NSURL *)url
           sessionConfiguration:(nullable NSURLSessionConfiguration *)configuration NS_DESIGNATED_INITIALIZER;

///---------------------------
/// @name Making HTTP Requests
///---------------------------

//获取一个GET请求
- (nullable NSURLSessionDataTask *)GET:(NSString *)URLString
                   parameters:(nullable id)parameters
                      success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                      failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE;


//获取一个GET请求
- (nullable NSURLSessionDataTask *)GET:(NSString *)URLString
                            parameters:(nullable id)parameters
                              progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgress
                               success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                               failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//获取一个HEAD请求
- (nullable NSURLSessionDataTask *)HEAD:(NSString *)URLString
                    parameters:(nullable id)parameters
                       success:(nullable void (^)(NSURLSessionDataTask *task))success
                       failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//获取一个POST请求
- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(nullable id)parameters
                       success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                       failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE;

//获取一个POST请求
- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
                             parameters:(nullable id)parameters
                               progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress
                                success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                                failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//获取一个POST请求
- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(nullable id)parameters
     constructingBodyWithBlock:(nullable void (^)(id <AFMultipartFormData> formData))block
                       success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                       failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE;

//获取一个POST请求
- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
                             parameters:(nullable id)parameters
              constructingBodyWithBlock:(nullable void (^)(id <AFMultipartFormData> formData))block
                               progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress
                                success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                                failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//获取一个PUT请求
- (nullable NSURLSessionDataTask *)PUT:(NSString *)URLString
                   parameters:(nullable id)parameters
                      success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                      failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//获取一个PATCH请求
- (nullable NSURLSessionDataTask *)PATCH:(NSString *)URLString
                     parameters:(nullable id)parameters
                        success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                        failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

//获取一个DELETE请求
- (nullable NSURLSessionDataTask *)DELETE:(NSString *)URLString
                      parameters:(nullable id)parameters
                         success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                         failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

@end

AFHTTPSessionManager提供了一系列的构造方法以及HTTP访问的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@interface AFHTTPSessionManager ()
@property (readwrite, nonatomic, strong) NSURL *baseURL;
@end

@implementation AFHTTPSessionManager
@dynamic responseSerializer;

//类方法,返回一个新创建的AFHTTPSessionManager对象
+ (instancetype)manager {
    return [[[self class] alloc] initWithBaseURL:nil];
}

//构造函数
- (instancetype)init {
    return [self initWithBaseURL:nil];
}

//构造函数
- (instancetype)initWithBaseURL:(NSURL *)url {
    return [self initWithBaseURL:url sessionConfiguration:nil];
}

//构造函数
- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration {
    return [self initWithBaseURL:nil sessionConfiguration:configuration];
}

//构造函数
- (instancetype)initWithBaseURL:(NSURL *)url
           sessionConfiguration:(NSURLSessionConfiguration *)configuration
{
    //调用父类的构造函数
    self = [super initWithSessionConfiguration:configuration];
    if (!self) {
        return nil;
    }

    // Ensure terminal slash for baseURL path, so that NSURL +URLWithString:relativeToURL: works as expected
    if ([[url path] length] > 0 && ![[url absoluteString] hasSuffix:@"/"]) {
        url = [url URLByAppendingPathComponent:@""];
    }

    self.baseURL = url;
    //获取单例的请求序列化和响应序列化器
    self.requestSerializer = [AFHTTPRequestSerializer serializer];
    self.responseSerializer = [AFJSONResponseSerializer serializer];

    return self;
}

#pragma mark -

//setter
- (void)setRequestSerializer:(AFHTTPRequestSerializer <AFURLRequestSerialization> *)requestSerializer {
    NSParameterAssert(requestSerializer);

    _requestSerializer = requestSerializer;
}

//setter
- (void)setResponseSerializer:(AFHTTPResponseSerializer <AFURLResponseSerialization> *)responseSerializer {
    NSParameterAssert(responseSerializer);

    [super setResponseSerializer:responseSerializer];
}

@dynamic securityPolicy;

//setter设置安全策略
- (void)setSecurityPolicy:(AFSecurityPolicy *)securityPolicy {
    if (securityPolicy.SSLPinningMode != AFSSLPinningModeNone && ![self.baseURL.scheme isEqualToString:@"https"]) {
        NSString *pinningMode = @"Unknown Pinning Mode";
        switch (securityPolicy.SSLPinningMode) {
            case AFSSLPinningModeNone:        pinningMode = @"AFSSLPinningModeNone"; break;
            case AFSSLPinningModeCertificate: pinningMode = @"AFSSLPinningModeCertificate"; break;
            case AFSSLPinningModePublicKey:   pinningMode = @"AFSSLPinningModePublicKey"; break;
        }
        NSString *reason = [NSString stringWithFormat:@"A security policy configured with `%@` can only be applied on a manager with a secure base URL (i.e. https)", pinningMode];
        @throw [NSException exceptionWithName:@"Invalid Security Policy" reason:reason userInfo:nil];
    }

    [super setSecurityPolicy:securityPolicy];
}

上面的方法就是一系列构造函数,用于初始化父类对象以及序列化器,设置安全策略等,没有太多复杂的内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//GET请求,调用下面那个方法
- (NSURLSessionDataTask *)GET:(NSString *)URLString
                   parameters:(id)parameters
                      success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                      failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
{

    return [self GET:URLString parameters:parameters progress:nil success:success failure:failure];
}

//GET请求
- (NSURLSessionDataTask *)GET:(NSString *)URLString
                   parameters:(id)parameters
                     progress:(void (^)(NSProgress * _Nonnull))downloadProgress
                      success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success
                      failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure
{
    //调用另一个方法构造GET请求
    NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"GET"
                                                        URLString:URLString
                                                       parameters:parameters
                                                   uploadProgress:nil
                                                 downloadProgress:downloadProgress
                                                          success:success
                                                          failure:failure];
    
    /*
    启动任务
    使用AFHTTPSessionManager创建的任务默认都帮你启动了,所以不需要手动调用resume方法了
    上一篇中讲解的AFURLSessionManager默认没有启动,所以获取任务后要手动启动
    */
    [dataTask resume];

    return dataTask;
}
//获取HEAD请求
- (NSURLSessionDataTask *)HEAD:(NSString *)URLString
                    parameters:(id)parameters
                       success:(void (^)(NSURLSessionDataTask *task))success
                       failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
{
    //同样调用下面的一个方法来获取
    NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"HEAD" URLString:URLString parameters:parameters uploadProgress:nil downloadProgress:nil success:^(NSURLSessionDataTask *task, __unused id responseObject) {
        if (success) {
            success(task);
        }
    } failure:failure];
    
    //默认启动任务
    [dataTask resume];

    return dataTask;
}
//获取POST请求
- (NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(id)parameters
                       success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                       failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
{
    //调用下面的方法获取
    return [self POST:URLString parameters:parameters progress:nil success:success failure:failure];
}

//获取POST请求
- (NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(id)parameters
                      progress:(void (^)(NSProgress * _Nonnull))uploadProgress
                       success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success
                       failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure
{
    //同GET HEAD方法一样,调用一个方法获取任务
    NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"POST" URLString:URLString parameters:parameters uploadProgress:uploadProgress downloadProgress:nil success:success failure:failure];
    //默认启动任务
    [dataTask resume];

    return dataTask;
}

//获取POST上传文件请求
- (NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(nullable id)parameters
     constructingBodyWithBlock:(nullable void (^)(id<AFMultipartFormData> _Nonnull))block
                       success:(nullable void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success
                       failure:(nullable void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure
{
    //调用下面的方法来构造上传文件的POST请求
    return [self POST:URLString parameters:parameters constructingBodyWithBlock:block progress:nil success:success failure:failure];
}

//上传文件POST请求
- (NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(id)parameters
     constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
                      progress:(nullable void (^)(NSProgress * _Nonnull))uploadProgress
                       success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                       failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
{
    //构造一个request请求
    NSError *serializationError = nil;
    NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters constructingBodyWithBlock:block error:&serializationError];
    //如果在做序列化时出错在主线程调用failure回调块
    if (serializationError) {
        if (failure) {
            dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{
                failure(nil, serializationError);
            });
        }

        return nil;
    }
    //调用父类的方法获取一个上传的任务
    __block NSURLSessionDataTask *task = [self uploadTaskWithStreamedRequest:request progress:uploadProgress completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
        if (error) {
            if (failure) {
                failure(task, error);
            }
        } else {
            if (success) {
                success(task, responseObject);
            }
        }
    }];
    //默认启动任务
    [task resume];

    return task;
}

//获取PUT请求
- (NSURLSessionDataTask *)PUT:(NSString *)URLString
                   parameters:(id)parameters
                      success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                      failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
{
    //通过一个通用的方法来获取dataTask
    NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"PUT" URLString:URLString parameters:parameters uploadProgress:nil downloadProgress:nil success:success failure:failure];
    //默认启动任务
    [dataTask resume];

    return dataTask;
}

//同上
- (NSURLSessionDataTask *)PATCH:(NSString *)URLString
                     parameters:(id)parameters
                        success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                        failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
{
    NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"PATCH" URLString:URLString parameters:parameters uploadProgress:nil downloadProgress:nil success:success failure:failure];

    [dataTask resume];

    return dataTask;
}

//同上
- (NSURLSessionDataTask *)DELETE:(NSString *)URLString
                      parameters:(id)parameters
                         success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                         failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
{
    NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"DELETE" URLString:URLString parameters:parameters uploadProgress:nil downloadProgress:nil success:success failure:failure];

    [dataTask resume];

    return dataTask;
}

//一个通用的方法来构造NSURLSessionDataTask
- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method
                                       URLString:(NSString *)URLString
                                      parameters:(id)parameters
                                  uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress
                                downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgress
                                         success:(void (^)(NSURLSessionDataTask *, id))success
                                         failure:(void (^)(NSURLSessionDataTask *, NSError *))failure
{
    //通过请求序列化器构造一个request请求
    //需要传入请求方法GET POST DELETE PUT这样的字符串 以及相关参数
    NSError *serializationError = nil;
    NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];
    //如果序列化失败在主线程中执行failure回调块
    if (serializationError) {
        if (failure) {
            dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{
                failure(nil, serializationError);
            });
        }

        return nil;
    }
    
    //序列化成功,调用父类的方法获取dataTask
    __block NSURLSessionDataTask *dataTask = nil;
    dataTask = [self dataTaskWithRequest:request
                          uploadProgress:uploadProgress
                        downloadProgress:downloadProgress
                       completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
        if (error) {
            if (failure) {
                failure(dataTask, error);
            }
        } else {
            if (success) {
                success(dataTask, responseObject);
            }
        }
    }];
    //返回dataTask
    return dataTask;
}

上面的代码也很简单,是在AFURLSessionManager之上做了一些处理,其中涉及的AFURLRequestSerializationAFURLResponseSerialization由于不是本系列文章的关注点所以没有相关讲解,有需要的读者请自行查阅。

AFHTTPSessionManager继承自AFURLSessionManager并提供了更加便捷的网络请求接口,如果阅读了前一篇AFURLSessionManager可以发现它才是重点。AFHTTPSessionManager只是在它的基础上做了一些简单的封装,提供了更加便捷的接口。

通过AFURLSessionManagerAFHTTPSessionManager源码的阅读可以学习到AFNetworking在代码设计方面的优点,以及对NSURLSession的使用更清晰了。

备注

由于作者水平有限,难免出现纰漏,如有问题还请不吝赐教。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.11.08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS AFNetworking 源码阅读一
大名鼎鼎的AFNetWorking,做iOS开发的人都知道吧。 AFNetWorking一款轻量级网络请求开源框架,基于iOS和mac os 网络进行扩展的高性能框架,大大降低了iOS开发工程师处理网络请求的难度,让iOS开发变成一件愉快的事情。
赵哥窟
2018/12/17
1.3K0
iOS AFNetworking 源码阅读一
AFNetworking框架分析(二)——AFURLSessionManager(上)
AFURLSessionManager 这个类是AFN框架的核心类,基本上通过它来实现了大部分核心功能。负责请求的建立、管理、销毁、安全、请求重定向、请求重启等各种功能。他主要实现了NSURLSession和NSRULSessionTask的封装。 首先来对比下系统URLSession网络请求与AFN网络请求的方法
我只不过是出来写写代码
2019/04/02
2K0
AFNetworking框架分析(二)——AFURLSessionManager(上)
iOS开发-AFNetworking详解
这是一篇AFNetworking的详细解析 使用示例 新建一个AFHTTPSessionManager的manager,然后用manager请求对应网址的信息,回调会调用success的completionHander代码块。 AFHTTPSessionManager* manager = [AFHTTPSessionManager manager]; [manager GET:@"www.baidu.com" parameters:nil progress:nil success:^(NSURLSe
落影
2018/04/27
1.6K0
iOS开发-AFNetworking详解
架构之路 (四) —— APP架构之工程实践中网络层的搭建(二)
它继承了AFHTTPSessionManager,提供了GET/POST等请求服务。
conanma
2021/09/04
2740
源码分析之AFNetworking(二)
AFHTTPSessionManager继承自AFURLSessionManager,提供了便捷的方法用于HTTP请求,当一个baseURL,根据相对路径,可以很方便地进行GET/POST或者其他请求。AFHTTPSessionManager本身并没有做什么实事,只是作为一个封装,将一些需求分发到其他相关类去做。
Helloted
2022/06/07
3740
源码分析之AFNetworking(二)
AFNetworking源码探究(二)GET请求实现之NSURLSessionDataTask实例化
这里很多类,我不会去每一个类单独的去分析,那样子轮着几圈可能也不是很清晰,我会以一个简单的例子入手,开始进行分析,由点带面,最后举一反三给大家串起来。
conanma
2021/09/02
5470
AFNetworking源码探究(十六) —— 请求序列化之协议方法的实现
上一篇对请求序列化的类、协议以及架构进行了分析,下一篇将对序列化的流程进行分析。这一篇将对请求序列化流程进行说明并分析这几个类中协议方法的实现。
conanma
2021/09/03
3790
iOS AFNetWrking PostBody传参
之前发送请求传给后台的参数都是 NSDictionary 类型的,最近后台要求传参数是 json 类型。因此封装了一个postBody的方法。一般的Post和postBody唯一的区别就是后台接受参数的类型不同,post是NSDictionary类型而postBody是jason类型。
赵哥窟
2019/06/15
1.3K0
[iOS源码笔记]·第三方网络下载处理框架:AFNetworking网络下载处理(调用栈与缓存策略篇)
看到这里,或许可以看manager对象的AFHTTPSessionManager类型更深层定义。
陈满iOS
2018/09/10
1.5K0
[iOS源码笔记]·第三方网络下载处理框架:AFNetworking网络下载处理(调用栈与缓存策略篇)
iOS afnetworking最新版报错 没有AFHTTPRequestOperationManager类了
今天开了一个小项目   用的是pod   然后  安装好 Afnetworking之后   发现 AFHTTPRequestOperationManager  这个类没有了  ,百度之后  发现 原来是弃用了。幸运的是找到了  网友的解决办法   在此分享一下 :这个就是AFHTTPRequestOperationManager找不到的原因了,它是基于NSURLConnection封装的!!于是找了一下,现在都用的是NSURLSession了,AFN中用的是AFHTTPSessionManager了~~ G
用户1219438
2018/02/01
3.2K0
AFNetworking框架分析(三)——AFURLSessionManager(下)
上一篇讲到在AFHTTPSessionManager中,在初始化NSMutableURLRequest对象时的流程分析。接下来继续分析在生成request之后AFN创建task任务的流程 在NSMutableURLRequest对象初始化之后,创建了一个NSURLSessionDataTask任务类对象,并将request传入。
我只不过是出来写写代码
2019/04/02
7560
AFNetworking框架分析(三)——AFURLSessionManager(下)
从AFNetworking源码分析到应用全解 原
    AFNetworking是iOS/OS开发中常用的一个第三方网络库,可以说它是目前最流行的网络库,但其代码结构其实并不复杂,也可以说非常简洁优美。在AFNetworking中,大量使用的线程安全的开发技巧,读此源码也是一次很好的多线程学习机会。本篇博客从主要结构和网络请求的主流程进行分享,解析了AFNetworking的设计思路与工作原理,后面还有其中提供的UI扩展包的接口应用总结。
珲少
2018/08/15
3.2K0
从AFNetworking源码分析到应用全解
                                                                            原
AFNetworking源码探究(二十三) —— UIKit相关之UIWebView+AFNetworking分类(六)
上一篇讲述了UIButton+AFNetworking的UIButton的一个分类。分析了其下载器的下载、图像的下载以及背景图像的下载。这一篇就继续讲述AFN中UIWebView的分类。
conanma
2021/09/03
4450
iOS----轻松掌握AFN网络顶级框架
AFN 一、什么是AFN 全称是AFNetworking,是对NSURLConnection的一层封装 虽然运行效率没有ASI高,但是使用比ASI简单 在iOS开发中,使用比较广泛 AFN的github地址 https://github.com/pokeb/AFNetworking/AFNetworking 二、AFN结构 NSURLConnection AFURLConnectionOperation AFHTTPRequestOperation AFHTTPRequestOperationManag
用户1941540
2018/05/11
1.3K0
iOS AFNetworking 源码阅读二
当解析错误,我们直接调用传进来的fauler的Block失败返回了,这里有一个self.completionQueue,这个是我们自定义的,这个是一个GCD的Queue如果设置了那么从这个Queue中回调结果,否则从主队列回调。
赵哥窟
2018/12/17
1.8K0
iOS AFNetworking 源码阅读二
iOS-网络编程(三)AFNetworking使用
一. AFNetworking简单介绍 通过前面学习的HTTP协议的基本知识,GET/POST请求的区别,NSURLConnection 和 NSURLSession的使用,已经基本了解了网络请求的方
xx_Cc
2018/05/10
2.2K0
AFNetworking简单封装(Block形式)
前言 之前写了 AFNetworking 的基本用法 这次就简单的封装一下 封装 ZJAFNetworkingKit.h #import <Foundation/Foundation.h> #import "AFNetworking/AFNetworking.h" typedef void(^ZJAFNetworkingBlock)(bool success,id responseObject,NSError * error); @interface ZJAFNetworkingKit : NSObjec
码客说
2019/10/22
1.3K0
AFNetworking3的常用操作
导入的最新版的AFNetworking3.1.0,突然发现找不到AFHTTPRequestOperationManager了。 刚开始以为是cocoapods没有给我导进去,后来发现也没有这NSURLConnection了,被弃用了,突然意识到,这个就是AFHTTPRequestOperationManager找不到的原因了,它是基于NSURLConnection封装的!! 于是找了一下,现在都用的是NSURLSession了,AFNetworking中用的是AFHTTPSessionManager了
码客说
2019/10/22
6760
iOS_AFNetworking 结构解析+用例分析+源码阅读
Github OC语言排第一, 其凝聚了众多大神的智慧,无论是在技术点上,还是架构设计上、问题处理方式上,都具有很高的学习价值。
mikimo
2022/07/20
6100
iOS_AFNetworking 结构解析+用例分析+源码阅读
AFNetworking 源码阅读(v3.2.1)
AFNetworking项目地址 https://github.com/AFNetworking/AFNetworking 下载打开后目录 AFNetworking 1.AFNetwork
用户2215591
2018/07/05
2.2K0
推荐阅读
相关推荐
iOS AFNetworking 源码阅读一
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验