登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

AFNetworking 3.0

[复制链接]
来自: 李世铿 分类: iOS精品源码 上传时间: 2016-4-25 15:41:46

项目介绍:

文:Jay的iOS開發筆記

AFNetworking前言
AFNetworking是一款在 OS X 和 iOS 下都令人喜愛的网络库。為了迎合iOS新版本的升级, AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持。如果你的项目以前使用过这些API,建议您立即升级到基于 NSURLSession 的API的AFNetworking的版本。本指南将引导您完成这个过程。 本指南是为了引导使用AFNetworking 2.x升级到最新的版本API,以达到过渡的目的,並且解释了新增和更改的设计结构。

新设备要求: iOS 7, Mac OS X 10.9, watchOS 2, tvOS 9, & Xcode 7

AFNetworking 3.0正式支持的iOS 7, Mac OS X的10.9, watchOS 2 , tvOS 9 和Xcode 7。如果你想使用AFNetworking在针对较旧版本的SDK项目,请检查 README 的兼容性信息。

NSURLConnection的API已废弃
AFNetworking 1.0建立在NSURLConnection的基础API之上 ,AFNetworking 2.0開始使用NSURLConnection的基础API ,以及较新基于NSURLSession的API的选项。 AFNetworking 3.0現已完全基于NSURLSession的API,这降低了维护的负担,同時支持蘋果增强关于NSURLSession提供的任何额外功能。由于Xcode 7中,NSURLConnection的API已經正式被蘋果弃用。雖然該API将继续运行,但將沒有新功能將被添加,並且苹果已經通知所有基于网络的功能,以充分使NSURLSession向前发展。
AFNetworking 2.X將继续获得关键的隐患和安全补丁,但沒有新的功能将被添加。Alamofire(Swift下的网路请求)软件基金会建议,所有的项目将迁移到基于NSURLSession的API。

弃用的类
下面的类已从AFNetworking 3.0中废弃:
          AFURLConnectionOperation         
          AFHTTPRequestOperation         
          AFHTTPRequestOperationManager

修改的类
下面的类包含基于NSURLConnection的API的内部实现。他們已經被使用NSURLSession重构:
          UIImageView+AFNetworking         
          UIWebView+AFNetworking         
          UIButton+AFNetworking

迁移
AFHTTPRequestOperationManager 核心代码
如果你以前使用 AFHTTPRequestOperationManager , 你将需要迁移去使用AFHTTPSessionManager。 以下的类在兩者过渡间並沒有变化:
securityPolicy requestSerializer responseSerializer 接下來举一個关于AFHTTPSessionManager的简单例子。注意HTTP网路请求返回的不再是AFHTTPRequestOperation, 修改成为了NSURLSessionTask,並且成功和失败的Block中的参数也变更为了NSURLSessionTask,而不再是AFHTTPRequestOperation。
AFNetworking 2.x
[Objective-C] 查看源文件 复制代码
          AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
          [manager GET:@"請求的url" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

                        NSLog(@"成功");
          } failure:^(AFHTTPRequestOperation *operation, NSError*error) {

                        NSLog(@"失敗");
          }];


AFNetworking 3.0
[Objective-C] 查看源文件 复制代码
         AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
          [session GET:@"請求的url" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {

                        NSLog(@"成功");
          } failure:^(NSURLSessionDataTask *task, NSError *error) {

                        NSLog(@"失敗");        
          }];


AFHTTPRequestOperation 核心代码
与NSURLConnection对象不同,每個共用应用范围的设置如会话管理、缓存策略、Cookie存储以及URL协议等,这些NSURLSession对象都可以单独进行配置。使用特定的配置來初始化会话,它可以发送任务来获取数据,並上传或下载文件。
在AFNetworking 2.0中,使用AFHTTPRequestOperation,有可能创建一个沒有额外开销的独立的网路请求來获取数据。NSURLSession则需要更多的开销,為了获得所要请求的数据。
接下來,将要通过AFHTTPSessionManager创建一个对象,并创建一个任务和启动他。

AFNetworking 2.x
[Objective-C] 查看源文件 复制代码
          NSURL *URL = [NSURL URLWithString:@""];
          NSURLRequest *request = [NSURLRequest requestWithURL:URL];
          AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
          op.responseSerializer = [AFJSONResponseSerializer serializer];
          [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

                        NSLog(@"JSON: %@", responseObject);
          } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

                        NSLog(@"Error: %@", error);
          }];
          [[NSOperationQueue mainQueue] addOperation:op];


AFNetworking 3.0
[Objective-C] 查看源文件 复制代码
    NSURL *URL = [NSURL URLWithString:@""];
          AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
          [manager GET:URL.absoluteString parameters:nil success:^(NSURLSessionTask *task, id responseObject) {

                        NSLog(@"JSON: %@", responseObject);
          } failure:^(NSURLSessionTask *operation, NSError *error) {

                        NSLog(@"Error: %@", error);
          }];


UIKit的迁移
图片下载已经被重构,以遵循AlamofireImage架构与新的AFImageDownloader类。這個类的图片下载职责的代理是UIButton与UIImageView的类目,并且提供了一些方法,在必要時可以自定义。类別中,下载远程图片的实际方法沒有改变。
UIWebView的类目被重构为使用AFHTTPSessionManager作为其网路请求。
UIAlertView的类目被废弃
从AFNetworking 3.0后UIAlertView的类目因过时而被废弃。並沒有提供UIAlertController类目的计划,因為這是程序应该处理的逻辑。



開始建構你的AFNetworking
1.让我們先开一个Class,继承NSObject,在这边我把它取名为TestAPI。


2.我們进入到TestAPI.h,加上这些代码,等等会一一进行解释。
我們在.h 首先要把AFNetworking給import进来,然后声明兩个block,一個是回传成功的方法,一個是回传失败的方法,然後init跟request两个方法我們留到.m再讨论,这个TestAPI的Class里面我想要使用两个API,一個是我传入名字得到外号;另一個是我传入名字得到年龄。

3.接著再进到.m里面把block建好。
兩個block:
          (^finishBlock) (id) 傳進一個任意型別,接收後再處理          (^failBlock) (int, int)傳進兩個int分別是伺服器會給你的StatusCode跟ErrorCode;
init沒什麼好说的,就是之后方法回传我們会把结果包进这个block而已,request这边就是我們在做请求的時候,要把整个包好的东西丟回去給你呼叫的Class做处理。

4.先建取得外号的方法。


5.再建取得年龄的方法。


其实方法有分Get、Put、Post...等方法,這邊我例子做Post而已,剩下都大同小异,差异性稍微看一下官方的文档就可以知道了。首先當然要声明一個字串的Url來知道你的接口位置,通常前面的IP不会变,后面的接口位置會变,所以我個人会习惯把IP跟各個接口位置define起來所以会变成:
         
[Objective-C] 查看源文件 复制代码
NSString *urlAPI = [NSString stringWithFormat: @"%@%@",後台ip,接口位置];


manager这边要注意的是
         
[Objective-C] 查看源文件 复制代码
 manager.requestSerializer = [AFJSONRequestSerializer serializer];          
          manager.responseSerializer = [AFJSONResponseSerializer serializer];


这兩个方法,我們现在是丟json回json(AFNetworking会帮你转好),如果回的是Http的話,那就要变成:
         
[Objective-C] 查看源文件 复制代码
 manager.responseSerializer = [AFHTTPResponseSerializer serializer];


parameters用一包Dictnoary丟過去就好,对应后台的Key - Value。成功跟失败部分我們先看
     
[Actionscript3] 查看源文件 复制代码
     self.finishBlock(responseObject);          
          self.failBlock((int)statusCode, (int)errorCode);


這兩行简单的说就是把成功回的responseObject塞进block里面,服务器的StatusCode跟ErrorCode塞进失败的block里,然后你的block就会在调用对应方法之后传回你的ViewController。

6.AFNetworking3.0取得error变得比較复杂一點了,我們不能直接使用error就取到我們想要的東西,必須要做一些处理,首先我們再開一個Class一樣继承NSObject(其实继承神马都沒关系,我习惯同時有传值跟回传值的Model用C的function來写),我把它取名為HttpResponseErrorCode。


7.在这边.h我先建了三個分法,分別是取到StatusCode、ErrorCode、Error(ErrorMessage要从这里捞)。
8.然後.m的方法如下:
这边要取得userInfo里面的[AFNetworkingOperationFailingURLResponseDataErrorKey],再转成NSData,再用JSONObject接,然後就可以转成Dictionary了,不要問我为什么这么复杂......不这样转还真转不出來,有成功用其他方法转出來的前辈也麻煩指教一下。

9.接着我們回到第4跟第5步骤的fail的处理看
[Objective-C] 查看源文件 复制代码
          NSInteger statusCode = getErrorStatusCode(task);

          NSInteger errorCode = getErrorCode(error);

          NSDictionary *errorDict = getError(error);

          NSString *errorMessage = errorDict[@"message"];

          NSLog(@"error : %@",errorMessage);

          self.failBlock((int)statusCode, (int)errorCode);
这样是不是了解了呢~~C function的好处就是直接import进来就可以直接使用。


開始使用你构建好的AFNetworking框架
現在我們可以開始使用我們构建好的框架了,使用方法非常简单,首先import你的API的Class,然後就可以直接叫出來使用了。
虽然这样方法在配置上很麻烦,但好处就是我只要呼叫一种方法,后面带上包进去的方法名称,就可以很直接的使用,至于为什么要包block是因为如果我們要做一些回传后的处理會方便很多(EX.登入页面成功就登入换页,失败则跳出Alert告知使用者.....等),另外我也习惯关于View的部分透過block在ViewController做处理,暂存或是要存到资料库的资料直接在Model的success里就把他做掉,这样ViewController只要处理有关View的部分就好,另外要新开一个Class分类不同API请求的話,90%的代码都复制粘贴就好,要改的只有request传回的Class、方法名称、parameters要传的参数、API接口而已。

AFNetworing 下载:https://github.com/AFNetworking/AFNetworking


相关源码推荐:

我来说两句
*滑动验证:
所有评论(4)
青书展码 2016-4-25 17:30:05
感谢,学到不少
回复
xiezuan 2016-4-25 19:36:59
管理员那么多勋章是什么鬼
回复
李世铿 2016-4-25 19:58:09
xiezuan 发表于 2016-4-25 19:36
管理员那么多勋章是什么鬼

http://www.code4app.com/thread-7741-1-1.html  一起来玩吧~
回复
Lin丶Max 2016-4-26 10:10:00
mark一下 给力!
谢谢楼主!
回复
4708 1 0
联系我们
首页/微信公众账号投稿

帖子代码编辑/版权问题

QQ:435399051,742864542

如何获得代码达人称号?

代码贡献英雄榜
用户名 下载数
通过邮件订阅最新 Code4App 信息
上一条 /4 下一条
联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

快速回复 返回顶部 返回列表