文档章节

对于AlamoFire几点思考

 刘星石
发布于 2016/03/02 14:44
字数 2118
阅读 20
收藏 0
点赞 1
评论 0

本文由CocoaChina--BYB_1132(论坛ID)翻译

原文:Thoughts On AlamoFire--Swift’s AFNetworking Implementation

HTTP协议就是现代开发的同义词,对于有经验的iOS开发者来说, 熟悉并尽可能使用这些流行的协议是日常工作的基础。

不出意料,iOS 应用在这一点上没有什么不同,成千上万的app和工程师都依靠广受欢迎的AFNetworking 库实现与服务器的交互,JSON解析, 以及提供占位符图片等多个功能。

简言之,做到这些并不容易。这篇文章中我们了要解的是Alamofire库。

基础

Alamofire的核心主要是试图简化iOS中HTTP网络连接, 它通过使用NSURLSession以及Foundation URL Loading System来创建一个Swift本地的网络访问接口,从而实现令人难以置信效率的任务。

Swift放弃了代理模式取而代之的使用了回调。对于我而言,我喜欢这个选择。然而基础承诺机制模式(promise-based patterns)也能起到一定作用, 它们也隐藏了一些坏代码味道,对于一些人有点太神奇了。

进一步看,它是异步实现的。你也许听说过,但是在主线程上执行网络调用并不是一个好主意,不过Alamofire采用了许多创造性的最优方法。

例如,通过NSURLCache处理缓存来阻止不必要的访问请求。另外,如果HTTP状态码在可接受的范围内(200-300),就可以利用其丰富的链路模式通过少量代码去做大量有意义的工作。

历史总在重复

Alamofire 也承续了AFNetworing使用者所熟悉的模式,一些处理方法也不同于它的前身,主要因为Alamofire是为了Swift而创建的。

例如, AFNetworking 调用子类AFHTTPSessionManager来使用每个API。也有例外,比如用NSURLSession替换NSURLConection。

Alamofire 通过遵守URLRequestConvertible协议创建一个路由Router来调用了类似的方法, 在底层,Alamofire 使用单例模式来创建在 NSURLSessionConfiguration.的顶层

初体验 

我们开始吧

1
2
3
Alamofire.request(.GET, “http: //www.telize.com/jsonip?callback=getip").response {(request, response, data, error) in
     println(request + response + error)
}

像AFNetworking 和其他的HTTP网络库一样,Alamofire提供了简单、易用的方法来快速随性的使用网络请求。这种特定的网络GET请求会返回一个请求对象,这个对象可以依附实现所有的HTTP过程的方法。

在Alamofire中,默认的行为规范是从服务器响应积累到的NSData(数据),我通过一个闭包来链接一个响应处理程序来解析响应,或者但愿对任何错误的响应不会发生在请求过程中。

  • 响应

响应通过HTTP用不同的形式显现,最受青睐的毫无疑问是JSON, JSON是XML的衍生品,相对XML更年轻更健壮。Alamofire对JSON型数据很友好。

1
2
3
Alamofire.request(.GET, “http: //httpbin.org/get").responseJSON {(request, response, JSON, error) in
     println(JSON)
}

有一系列简单的JSON字符串作为指定的响应返回数据

我们继续

在Alamofire中, 链接在其框架的使用中很底层, 每当想到在OC中用方括号去定义类,让人或高兴或无奈。

Swift 像其他大多数高级语言一样, 通过简单的"."来调用函数, Alamofire 可以管理很多响应处理程序,而且一旦服务器返回响应它都会异步执行。 

和往常一样, 看示例最可靠

1
2
3
4
5
6
7
8
9
Alamofire.request(.GET, “http: //httpbin.org/get")
     .authenticate(HTTPBasic: user, password: password)
     .progress { (bytesRead, totalBytesRead, totalBytesExpectedToRead)  in
     println(totalBytesRead)
}.responseJSON { (request, response, JSON, error)  in
     println(JSON)
}.responseString { (request, response, string, error)  in
     println(string)
}

参数

当然, 如果HTTP网络请求缺少了POST请求或查询指定的访问请求的能力就没那么令人期待了。

1
Alamofire.request(.GET,  "http://httpbin.org/get" , parameters: [ "key" "value" ])

在Alamofire需要内嵌一个包含参数的一个字典, 如果你不指向特定的参数, 将传入nil。对于编码来说也是一样的, 在网络请求函数这是第四个参数.

枚举

如果有人已经使用过swift, 它们可能发现枚举在Swift 中是如此的好用。在 Objective-C中,即使有现代化的NS_ENUM,它仍然只是允许定义整数声明。

Swift 还有很多小技巧

Alamofire充分拥有这些技巧, 因此在一个HTTP通信中所有的编码参数逻辑都是用参数编码(ParameterEncoding)枚举实现, 所有的HTTP verbs都以 RFC 2616 §9 定义, 如下:

1
2
3
4
5
6
7
8
9
10
11
12
public enum Method: String
{
     case  OPTIONS = “OPTIONS”
     case  GET = “GET”
     case  HEAD = “HEAD”
     case  POST = “POST”
     case  PUT = “PUT”
     case  PATCH = “PATCH”
     case  DELETE = “DELETE”
     case  TRACE = “TRACE”
     case  CONNECT = “CONNECT”
}

同时,如果你好奇Swift枚举强大的功能, 免费下载 swift starter guide。请原谅我做的这个小广告。

路由

创建一个网络访问路由是实现的关键, 在这里将定义一些共同的用于同一个 API 的端点, 通过一个遵循URLRequestConvertible的枚举来创建一个路由。

当一个枚举遵循URLRequestConvertible时, 它需要包含一个叫做URLRequest的变量, 这个变量必须是NSURLRequest类型.

对于HTTP网络库的通常做法发生在这里, 使用者极大可能定义一个静态字符串来代表一个基础的URL以及API key/consumer secret.

记住,在现实世界中最好不要将这些内容放到源代码周围。我个人选择plist文件。

在任何情况下……

工作流如下:

  • 定义一个基本的URL

  • 通过在枚举中的case语句定义端口(例如 Users, Comments等等)

  • URLRequest初始化并通过一个跟踪闭包设置。在闭包中, 增加参数并构造端点。

  • URL、URLRequest 和编码都占一个完全的网络请求发送到服务器 

多读几遍这个, 首先, 我认为这点有些不合理---一个函数实现过多的功能

在实践中,它运作得很好:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
enum APIRouter: URLRequestConvertible
{
     static let BASE_URL =  //base url
     static let API_KEY =  //api key, consumer secret for OAuth, etc
     
     case  User(Int)
     case  ProfilePicture(Int, Size)
     case  Likes(Int, Int)
  
     var  URLRequest: NSURLRequest
     {
         let (path: String, parameters: [String: AnyObject]) =
         {
             switch  self
             {
                  case  .User (let page):
                      let params = [] //Provide params
                      return  (“/user”, params)
                  case  .ProfilePicture(let id, let size): 
                      var  params = [] 
                      return  (“/profilepictures/\(id)”, params) 
                  case  .Likes(let id, let commentsPage): 
                      var  params = []  
                      return  (“/likes/\(id)/user”, params)
             }
         }()
  
         let URL = NSURL(string: APIRouter.BASE_URL)
         let URLRequest = NSURLRequest(URL:URL!.URLByAppendingPathComponent(path))
         let encoding = Alamofire.ParameterEncoding.URL
         return  encoding.encode(URLRequest, parameters: parameters).0
     }
}

一个强有力的例子, 但是我选择把代码展示的更形象些。

丰富的功能

Alamofire有许多让程序猿信服去使用它的理由。在iOS开发中,使用NURLSession是HTTP网络的未来趋势, 相比NSURLConnection来说,它的功能更加丰富: 

  • 后台上传和下载

  • 暂停以及重新开始网络操作的能力

  • 可配置的容器(Container)

  • 子类和私有存储

  • 改进的认证处理

  • 对每个基础连接进行身份验证

  • 多种代理模式--NSURLConnection拥有异步代码块的基本方法, 但是不能用它们的代理,NSURLSession具有一种混合型的方法。

我认为大家都同意这是正确的选择, 如果有人对AFNetworking 能做而Alamofire不能做的感兴趣的话,那么有以下几点:

  • UIKit 扩展

  • TLS验证

  • NSOperation/NSURLConnection/AFURLConnectionOperation调用

  • 可达性(Reachability)

  • 多重HTTP网络请求构架

根据使用情况决定, 需要使用这些特点的要么是破坏游戏规则的人,要么是不在乎的人。

总结

在这一点上,部分工程师争论认为NSURLSession让AFNetworking变成了一个华丽的封装。这可能在某种程度上是正确的,但即使如此--这是一件坏事吗?

它在简化和抽象方面做的很好,虽然它不包含AFNetworking可以做的所有功能,但是这是 Swift 中 HTTP 网络的一个良好开端。

问啊-一键呼叫程序员答题神器,牛人一对一服务,开发者编程必备官方网站:www.wenaaa.com

QQ群290551701 聚集很多互联网精英,技术总监,架构师,项目经理!开源技术研究,欢迎业内人士,大牛及新手有志于从事IT行业人员进入!


本文转载自:http://www.cocoachina.com/ios/20160302/15493.html

共有 人打赏支持
粉丝 16
博文 142
码字总数 13945
作品 0
天津
深入理解Moya

前言 Moya是一个基于Alamofire开发的,轻量级的Swift网络层。Moya的可扩展性非常强,可以方便的RXSwift,PromiseKit和ObjectMapper结合。 如果你的项目刚刚搭建,并且是纯Swift的,非常推荐以...

黄文臣
2017/08/11
0
0
Swift 3.0封装 URLSession 的GET/SET方法代替 Alamofire

升级到 Swift3.0 之后,新版本的 Alamofire 只支持 iOS 9.0 以上的系统,如果要适配 iOS 8,需要自己封装 URLSession,下面是笔者的方案: 这里使用的是 Swift 自己的原生类型 URLSession,而...

cg1991130
2016/10/10
0
0
swift基于Alamofire的简易封装整理

// // BLHttpSessionsRequest.swift // ALSFinancial-Swift // // Created by 冰泪 on 16/8/23. // Copyright © 2016年 冰泪. All rights reserved. //网络请求类封装 import UIKit import ......

冰泪_
2016/09/06
2K
0
Xcode7.1下用CocoaPods安装Alamofire--swift下的第三方网络库

由于之前网上搜到的Alamofire是1.3版本的。所以安装到Xcode7.1下会报错,所以整理了Alamofire3.1版本用cocoapods安装。方便大家使用。本文适合CocoaPods新手。 在已经安装了CocoaPods的前提下...

啪神
2015/10/30
0
0
Alamofire 4.4.0 发布,HTTP 网络开发工具包

Alamofire 4.4.0 发布了,Alamofire 是用一个功能强大的,用 Swift 语言编写的 HTTP 网络开发工具包,支持各种 HTTP Method、JSON、文件上传、文件下载和多种认证方法。 更新内容: 新增 一个...

王练
2017/03/02
709
0
Alamofire的设计之道

前言: Alamofire是一个由Swift编写的优雅的网络开发框架。 大部分用Swift编写的iOS App的网络模块都是基于Alamofire的。作为Swift社区最活跃的几个项目之一,有许多开发者在不断的对其进行完...

黄文臣
2017/06/15
0
0
knight.lu/SwiftHttp

Alamofire is an HTTP networking library written in Swift, from the creator of AFNetworking. Features Chainable Request / Response methods URL / JSON / plist Parameter Encoding U......

knight.lu
2014/10/10
0
0
iOS 第三方库收藏以及相关iOS开发工具

1.autolayout :Swift: SnapKit ,OC: Masonry 1.1.YYKit,YYKit 是一组庞大、功能丰富的 iOS 组件 1.2 MJExtension 以及 MJFresh 2.达到 60 FPS 的滚动帧率 :Swift :AsyncDisplayKit 3.swift加......

樗同学
2016/08/10
34
0
Swift iOS : 使用CocoaPods管理依赖

iOS 程序提供依赖管理的工具,它的名字叫做:CocoaPods。开发一个可用的系统,再怎么小也需要依赖第三方库,比如大家常常采用Alamofire这个第三方库来访问网络。 以我自己为例,我5月份开始研...

刘传君
2017/12/07
0
0
Alamofire源码解读系列之错误处理(AFError)

1.正常用法 2.声明为整型 3.声明为字符串类型 4.声明为浮点类型 5.其他类型 6.enum包含enum 7.结构体和枚举 8.值关联 9.枚举中的函数 10.枚举中的属性 ParameterEncodingFailureReason 通过我...

冰泪_
01/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
24分钟前
0
0
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
31分钟前
2
0
HFS

FS,它是一种上传文件的软件。 专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,...

garkey
35分钟前
1
0
Java IO类库之BufferedInputStream

一、BufferedInputStream介绍 /** * A <code>BufferedInputStream</code> adds * functionality to another input stream-namely, * the ability to buffer the input and to * sup......

老韭菜
38分钟前
0
0
STM 32 窗口看门狗

http://bbs.elecfans.com/jishu_805708_1_1.html https://blog.csdn.net/a1985831055/article/details/77404131...

whoisliang
昨天
0
0
Dubbo解析(六)-服务调用

当dubbo消费方和提供方都发布和引用完成后,第四步就是消费方调用提供方。 还是以dubbo的DemoService举例 -- 提供方<dubbo:application name="demo-provider"/><dubbo:registry address="z...

青离
昨天
1
0
iptables规则备份和恢复、firewalld的9个zone以及操作和service的操作

保存以及备份iptalbes规则 设定了的防火墙规则要进行保存,否则系统重启后这些规则就没有了,使用命令 ”service iptables save ” 会把设定好的防火墙规则保存到文件/etc/sysconfig/iptabl...

黄昏残影
昨天
0
0
k8s image

k8s.gcr.io/kube-apiserver-amd64:v1.11.0k8s.gcr.io/kube-controller-manager-amd64:v1.11.0k8s.gcr.io/kube-scheduler-amd64:v1.11.0k8s.gcr.io/kube-proxy-amd64:v1.11.0k8s.gcr.......

分秒
昨天
0
0
数据结构--排序

这篇博客包含了数据结构中多种的排序算法: (1)简单选择:第一趟在A[0]~A[n-1]之间找到最小的,与A[0]进行交换,之后在A[1]~A[n-1]之间进行。。。第i趟在A[i-1]~A[n-1]之间找到最小的,最后...

wangxuwei
昨天
1
0
一名3年工作经验的java程序员应该具备的职业技能

一名3年工作经验的Java程序员应该具备的技能,这可能是Java程序员们比较关心的内容。我这里要说明一下,以下列举的内容不是都要会的东西—-但是如果你掌握得越多,最终能得到的评价、拿到的薪...

老道士
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部