本章节由CocoaChina翻译组成员星夜暮晨(博客)翻译自raywenderlich:Beginning Alamofire Tutorial,敬请勘误。
AFNetworking是 iOS 和 OS X 上最受欢迎的第三方库之一。它曾在我们的2012年的读者评选中荣获2012年度最佳 iOS 库称号。它同样也在 Github 上面获得了14000多个 stars 和4000多个 forks,是使用最广的开源项目之一。
最近,AFNetworking 的作者Mattt Thompson提交了一个新的类似于 AFNetworking 的网络 基础库,并且是专门使用最新的 Swift 语言来编写的,名为:Alamofire
AFNetwork 的前缀 AF 是 Alamofire 的缩写,因此这个新的库名称其实是根据 Swift 的约定来进行命名的。
在本教程的第一部分中,我们将带领大家使用 Alamofire 来制作一个图片库应用,其来源是500px.com。在这个过程中,您可以学习到如何使用 Alamofire 中的重要组件,以及了解在应用中处理网络请求的某些重要的知识点。
本教程的第二部分将基于第一部分所制作的应用,并为其增加一些好用的功能。您可以通过这个过程学习到更多高级的 Alamofire 用法。
本教程假定您已熟悉 Swift 语言以及 iOS 开发。如果不是的话,请参阅我们的其他教程。还有,本教程使用 Xcode 6.1 作为开发环境(而不是 Xcode 6.2 beta)。
> 提示:如果您已经熟悉了 Alamofire 的基本用法,那么您可以直接跳到本文的第二部分。但是请确保您已拥有消费者密钥(cunsumer key),然后参照下文在应用中替换它。
让我们开始吧
首先下载本次教程的初始项目。这个项目中提供了在本教程中需要的全部 UI。这有助于您能够将注意力集中到学习 Alamofire 的使用上来,而不是花费大量时间来研究 UI。
在 Xcode 中打开这个项目,并跳转到Main.storyboard来:
我们应用的主屏幕使用UITabBarController这个常用的 UI 样式。我们的标签控制器中包含有两个标签,每个标签都有它们自己的UINavigationController页面。第一个标签让用户浏览热门图片。第二个标签让用户浏览他们已保存的文件。两个标签都使用`UICollectionViewController`来向用户展示图片。故事板中同样也包含了两个独立的视图控制器,在接下来的教程中我们将会用到它们。
生成并运行该应用,您首先会看到一个不停在加载的加载控件:
这看起来一点也不高端大气上档次……可以说没什么可看的。但是很快我们将会借助 Alamofire 来让他逼格高起来。
> 提示:如果您很熟悉 AFNetworking 的使用,那么您可能会觉得下一节我们将谈论 CocoaPods。但是就目前来说,还没有一个通过 CocoaPods 来整合 Swift 库的简单方法。
虽然说可能有人发现了该问题的解决方法,并将其上传到网上,但是下面的步骤仍然还是使用手动复制代码到项目中的这样一个可靠的方法。
要获取最新版本的 Alamofire,前往https://github.com/Alamofire/Alamofire然后单击网页右边的Download ZIP按钮。接着在 Finder 中打开起始项目文件夹,然后将Alamofire-master文件夹拖入到您的主项目文件夹中。
打开Alamofire-master文件夹(现在它位于您的项目文件夹中),然后将Alamofire.xcodeprij文件(注意是蓝色图标!不是白色图标!)直接拖进 Xcode 中的 Photomania 项目下面,如下图所示:
接下来,单击Photomania项目,进入General窗口。滚动到Embedded Binaries项,然后单击其下方的 + 号。选择Alamofire.framework,最后点击Add完成添加。
生成并运行您的项目以确保没有任何错误出现,然后就可以进入到下一节内容了。
使用 Alamofire 来检索数据
您可能会觉得,为什么我们要使用 Alamofire 呢?明明苹果已经提供了NSURLSession类以及其相关类,以便让我们通过 HTTP 来下载相应内容。为什么我们还要使用第三方库来让这件事情变得复杂呢?
简单来说,Alamofire 其实是基于`NSURLSession`的,但是它可以免去您写样板(boilerplate)代码的麻烦,并且可以让网络模块的代码更为简单易用。您可以通过一些非常简单的操作来访问 Internet 上的数据,并且写出来的代码也会更加清晰明了、简单易读。
要使用 Alamofire 的话,首先需要导入它。请打开PhotoBrowserCollectionViewController.swift文件,然后在文件顶部添加如下代码:
1
|
import Alamofire
|
您需要在每个使用了 Alamofire 类以及函数的文件中添加这条`import`语句。
接下来,在`setupView()`下方的`viewDidLoad()`方法中添加如下代码:
1
2
3
4
|
(_, _, data, _)
in
println(data)
}
|
过会儿我会对其做出详细解释,但是首先您需要生成并运行该应用,这个时候您会在控制台中看到如下信息:
1
2
3
4
|
Optional({
error =
"Consumer key missing."
;
status = 401;
})
|
您可能不明白它说了什么鬼,不过您已经成功地使用 Alamofire 来实现网络请求了!您向 Internet 上的资源发出了一个请求,然后返回了一个JSON 数据。
下面来解释一下那些代码到底做了些什么:
· Alamofire.request(_:_)接收两个参数:method和URLString。其中,method 通常是.GET、.POST;URLString通常是您想要访问的内容的 URL。其将返回一个Alamofire.Request对象。
· 通常情况下,您只需将请求对象链接到响应方法上。例如,在上面的代码中,请求对象简单地调用了responseJSON()方法。当网络请求完毕后,responseJSON()方法会调用我们所提供的闭包。在我们的示例中,我们只是简单的将经过解析的 JSON 输出到控制台中。
· 调用responseJSON方法意味着您期望获得一个 JSON 数据。在我们的示例中,Alamofire 试图解析响应数据并返回一个 JSON 对象。或者,您可以使用responsePropertyList来请求获得一个属性列表,也可以使用responseString来请求获得一个初始字符串。在本教程后面,您将了解更多关于响应序列化方法的使用方式。
您可以从控制台中看到输出的响应数据,服务器报告您需要一个名为consumer key的东西。在我们继续使用 Alamofire 之前,我们需要从 500px 网站的 API 中获取一个密钥。
获取消费者密钥
前往https://500px.com/signup,然后使用您的邮箱免费注册,或者使用您的 Facebook 、Twitter 或者 Google 帐号登录。
一旦您完成了注册流程,那么前往https://500px.com/settings/applications并单击"Register your application"。
您会看到如下所示的对话框:
红色大箭头指向的那些文本框里面的内容都是必填的。使用Alamofire Tutorial作为Application Name,然后使用iOS App作为Description。目前您的应用还没有Application URL,但是您可以随意输一个有效的网址来完成应用注册,您可以使用raywenderlich.com^_^。
最后,在Developer’s Email中输入您的邮箱地址,然后单击复选框来接受使用协议。
接着,单击 Register按钮,您会看到一个如下所示的框:
单击See application details链接,然后它会弹出详细信息,这时候您就可以定义您的消费者密钥了,如下所示:
从该页面中复制出您的消费者密钥,然后返回 Xcode,然后用如下代码替换掉目前为止您唯一添加的代码:
1
2
3
4
|
Alamofire.request(.GET,
"https://api.500px.com/v1/photos"
, parameters: [
"consumer_key"
:
"PASTE_YOUR_CONSUMER_KEY_HERE"
]).responseJSON() {
(_, _, JSON, _)
in
println(JSON)
}
|
请确保您已经用复制的消费者密钥来替换掉PASTE_YOUR_CONSUMER_KEY_HERE。
生成并运行您的应用,这时您会在控制台中看见海量的输出:
上述所有的输出意味着您成功地下载到了含有一些照片信息的 JSON。
JSON 数据中包含了一些图片集的属性、一些页面信息,以及一个图片数组。这里是我得到的搜索结果(您的可能会略有不同):
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
|