iOS AFNetWorking源码详解(二)

[中文教程]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
查看查看198 回复回复1 收藏收藏 分享淘帖 转播转播 分享分享 微信
查看: 198|回复: 1
收起左侧

[中文教程] iOS AFNetWorking源码详解(二)

[复制链接]
代码买卖 发表于 2016-7-25 02:24:52 | 显示全部楼层 |阅读模式
快来登录
获取优质的苹果资讯内容
收藏热门的iOS等技术干货
拷贝下载Swift Demo源代码
订阅梳理好了的知识点专辑
本帖最后由 代码买卖 于 2016-7-27 22:04 编辑

AFHTTPSessionManager继承于AFURLSessionManager,提供了更方便的HTTP请求方法,包括了GET、POST、PUT、PATCH、DELETE这五种方式,并且AF鼓励我们在AFHTTPSessionManager再进行一次封装来满足我们自己的业务需求

iOS AFNetWorking源码详解

iOS AFNetWorking源码详解(二) - 敏捷大拇指 - iOS AFNetWorking源码详解


在开始的地方,AF一直提醒到一个属性baseURL,这个变量你可以在进一步封装的时候,将baseURL写成你自己的HTTP请求原始地址,比如

[Objective-C] 纯文本查看 复制代码
+ (NSURL *)baseURL {
    return [NSURL URLWithString:kBaseURLString];
}


在对baseURL进行拼接的时候,也需要注意一下几点,防止出现请求的URL出现问题

[Objective-C] 纯文本查看 复制代码
NSURL *baseURL = [NSURL URLWithString:@"http://example.com/v1/"];
    [NSURL URLWithString:@"foo" relativeToURL:baseURL];                  // [url=http://example.com/v1/foo]http://example.com/v1/foo[/url]
    [NSURL URLWithString:@"foo?bar=baz" relativeToURL:baseURL];          // [url=http://example.com/v1/foo?bar=baz]http://example.com/v1/foo?bar=baz[/url]
    [NSURL URLWithString:@"/foo" relativeToURL:baseURL];                 // [url=http://example.com/foo]http://example.com/foo[/url]
    [NSURL URLWithString:@"foo/" relativeToURL:baseURL];                 // [url=http://example.com/v1/foo]http://example.com/v1/foo[/url]
    [NSURL URLWithString:@"/foo/" relativeToURL:baseURL];                // [url=http://example.com/foo/]http://example.com/foo/[/url]
    [NSURL URLWithString:@"http://example2.com/" relativeToURL:baseURL]; // [url=http://example2.com/]http://example2.com/[/url]


在初始化的方法里面,我们看到这个方法

[Objective-C] 纯文本查看 复制代码
- (instancetype)initWithBaseURL:(nullable NSURL *)url;
- (instancetype)initWithBaseURL:(nullable NSURL *)url
           sessionConfiguration:(nullable NSURLSessionConfiguration *)configuration NS_DESIGNATED_INITIALIZER;


NS_DESIGNATED_INITIALIZER的作用是什么呢?
指定的构造器通过发送初始化消息到父类来保证object被完全初始化,指定构造器有以下几个规则:

1.指定构造器必须调用父类的指定构造器

2.任何一个便利构造器必须调用最终指向指定构造器的其他构造器

3.具有指定构造器的类必须实现父类的所有指定构造器

[Objective-C] 纯文本查看 复制代码
- (instancetype)init {
    // 指向- [initWithBaseURL:]
          return [self initWithBaseURL:nil];
}

- (instancetype)initWithBaseURL:(NSURL *)url {
    // 指向- [initWithBaseURL:sessionConfiguration:]
    return [self initWithBaseURL:url sessionConfiguration:nil];
}

- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration {
    // 指向- [initWithBaseURL:sessionConfiguration:]
    return [self initWithBaseURL:nil sessionConfiguration:configuration];
}

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

    // baseURL赋值,AFHTTPRequestSerializer和AFJSONResponseSerializer序列化
    
    return self;
}


DEPRECATED_ATTRIBUTE这个相信大家见得比较多了,字面意思就是这个API不建议开发者再使用了,再使用时,会出现编译警告

[Objective-C] 纯文本查看 复制代码
- (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;


下面POST、GET、PUT、PATCH、DELETE方法传参基本都是大同小异

URLString表示请求的URL,parameters表示客户端请求内容的存储器,progress表示请求的进度,constructingBodyWithBlock里面只有一个formData用来拼接到HTTP的请求体,success表示请求成功后的block回调,failure表示请求失败的block回调

那么这几个请求有什么区别呢?

1、POST请求是向服务端发送数据的,用来更新资源信息,它可以改变数据的种类等资源

2、GET请求是向服务端发起请求数据,用来获取或查询资源信息

3、PUT请求和POST请求很像,都是发送数据的,但是PUT请求不能改变数据的种类等资源,它只能修改内容

4、DELETE请求就是用来删除某个资源的

5、PATCH请求和PUT请求一样,也是用来进行数据更新的,它是HTTP verb推荐用于更新的

在实际开发过程中,我们还是使用POST和GET请求是最多的

在请求实现的部分,都是调用了

[Objective-C] 纯文本查看 复制代码
-[dataTaskWithHTTPMethod:URLString:parameters:uploadProgress:downloadProgress:success:failure]


方法创建NSURLSessionDataTask对象

传参的内容基本都是和上一层方法一样,method指的就是请求的类型

[Objective-C] 纯文本查看 复制代码
- (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
{

    NSError *serializationError = nil;
    NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];
    if (serializationError) {
        if (failure) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgnu"
            dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{
                failure(nil, serializationError);
            });
#pragma clang diagnostic pop
        }

        return nil;
    }

    __block NSURLSessionDataTask *dataTask = nil;
    dataTask = [self dataTaskWithRequest:request
                          uploadProgress:uploadProgress
                        downloadProgress:downloadProgress
                       completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
        // 失败成功处理
    }];

    return dataTask;
}





相关内容

iOS AFNetWorking源码详解(一)

iOS AFNetWorking源码详解(二)

iOS AFNetWorking源码详解(三)

iOS AFNetWorking源码详解(四)

iOS AFNetWorking源码详解(五)

iOS AFNetWorking源码详解(六)

AFNetworking 3.0迁移指南 AFNetworking 3.0 Migration Guide




作者:zeeyang



都看到这里了,就把这篇资料推荐给您的好朋友吧,让他们也感受一下。

回帖是一种美德,也是对楼主发帖的尊重和支持。

*声明:敏捷大拇指是全球最大的Swift开发者社区、苹果粉丝家园、智能移动门户,所载内容仅限于传递更多最新信息,并不意味赞同其观点或证实其描述;内容仅供参考,并非绝对正确的建议。本站不对上述信息的真实性、合法性、完整性做出保证;转载请注明来源并加上本站链接,敏捷大拇指将保留所有法律权益。如有疑问或建议,邮件至marketing@swifthumb.com

*联系:微信公众平台:“swifthumb” / 腾讯微博:@swifthumb / 新浪微博:@swifthumb / 官方QQ一群:343549891(满) / 官方QQ二群:245285613 ,需要报上用户名才会被同意进群,请先注册敏捷大拇指

嗯,不错!期待更多好内容,支持一把:
支持敏捷大拇指,用支付宝支付10.24元 支持敏捷大拇指,用微信支付10.24元

本帖被以下淘专辑推荐:

firefighter 发表于 2016-7-26 14:09:44 | 显示全部楼层
赞楼主!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

做任务,领红包。
我要发帖

分享扩散

都看到这里了,就把这资料推荐给您的好朋友吧,让他们也感受一下。
您的每一位朋友访问此永久链接后,您都将获得相应的金钱积分奖励

相关标签

热门推荐

合作伙伴

Swift小苹果

  • 北京治世天下科技有限公司
  • ©2014-2016 敏捷大拇指
  • 京ICP备14029482号
  • Powered by Discuz! X3.1 Licensed
  • swifthumb Wechat Code
  •   
快速回复 返回顶部 返回列表