[swift] 怎样在Swift中使用CocoaPods

[复制链接]
查看1023 | 回复1 | 2015-7-12 10:30:53 | 显示全部楼层 |阅读模式
1435569492795988.jpg
5 G+ A7 S# E, ]6 Y5 ]/ o  a  本文由yake_099(博客)翻译自raywenderlich,作者:Joshua Greene
" G9 |$ u% a' c2 t  Q9 G6 ^
* [# }, S6 s( a- U  U; \  l  原文:How to Use CocoaPods with Swift
3 ?7 y* D8 v$ ~, ]: d' \3 F

+ R' _0 r. i2 o1 z% b8 K  最近关于CocoaPods有很多的议论。你可能从别的开发者那里听到过,或者在Github的目录中看到过。如果你之前从来没有用过,你可能会问,"CocoaPods到底是什么?"
0 t1 ?. N' l2 @# e6 t8 b& H  它不是神秘的亚马逊区域的部落人用手捡出来的生可可的豆荚,肯定不是!让CocoaPods website来回答可能是最好的:
+ [/ j: E. r$ v& ~9 j8 w$ }  CocoaPods是Cocoa项目的依赖管理工具。它有上千个能帮你优雅地扩充自己项目的库。
4 D/ T3 K+ o+ b  优雅地扩展项目听起来很令人好奇,但是什么是依赖管理工具呢?你为什么会需要它呢?
- \! R% F8 N& Z9 A; L4 s  无论你正在创建一个什么样的app,你都有可能会用到别的开发者的代码,无论是以框架的形式还是库的形式。你可能很熟悉UIKit和Foundation,这两个都是苹果提供的框架。
: k, A) S) W, N! j7 j5 {/ U  在这个教程中,你将会:
; j' c* F+ W8 h$ Q6 j2 L$ ]$ V; @! X0 {, e7 R( v3 G3 U/ ~+ L% U
  了解为什么要和第三方库做朋友
0 t8 w) c+ X0 R6 n9 K0 X9 }
% n' P5 [6 t) t! f7 w2 P+ y' T  安装CocoaPods/ N# X6 _0 {2 `

4 S6 a6 u  [/ q1 o* u! P, f& r* W  在一个starter项目中使用CocoaPods8 l+ @  _- W6 U6 b2 |0 u& ~
% |3 N' N3 N, j" T2 d
  安装使用并修改依赖关系文件来提高用户体验
# M; `* J4 }# g, N( g- g, ]  V8 s4 P" b. v1 `6 r
  了解语义化版本控制( G# u! j: g8 C+ Q  r
  为什么库是你的朋友3 |5 g/ X/ d5 b& v8 }0 Z* b* [# t) w! ]
  尽管你并不一定非要使用第三方库和框架,但是它们确实能节省你很多的时间,可以让你集中注意力在优化自己的app上,而不是敲无数行的你本不需要写的代码。
, j: e% ]( d: h2 I  你可以不通过依赖管理工具来使用第三方库和框架,我们网站提供了关于这种使用方式的实践性的教程。例如,这是我们的Alamofire教程和SwiftyJSON教程。" D! z7 ]+ q% V+ f5 G7 B4 `* n
  不使用依赖管理工具,你可以简单地通过手动方式将每个库添加到你的工程里面。然而,这个方法有几个缺点:
" g  N" g' C: E. y+ z- Q2 l5 X/ x+ I' h, |
  更新一个库到新的版本可能会很麻烦,尤其是一个库依赖于另外一个库的情况,那么就必须将这几个库全部更新。7 }' l% U9 V$ Y7 E3 X. A+ M
/ g# L* M; f6 P1 |! Y; G
  在项目中添加三方库可能会需要在代码中做一些本地的修改,这使得之后更新版本更加困难。1 }8 ]& U% X$ ~3 ]
5 U; I$ D$ C) e" f
  判断你的app中用到的库的当前版本也是一件困难的事,尤其是当你没有提前记录下来的时候。
! }6 }6 C$ ]( j" ~) p# T8 G9 m8 g
% C4 _! n' b9 l9 a' U  如果没有一个中央位置来查看所有可用库的话,查找新库也是一件很困难的事。
- i* H- g! B$ Y4 M  i! h7 h' H  CocoaPods帮你克服以上问题甚至更多别的问题。它抓取库代码,解决库之间的依赖性问题,帮你查找并发现新的库,甚至以最简便的方式为你的项目配置正确的环境。
  t9 }8 `- A6 L5 ~) A  前提$ l5 V' D9 W9 H0 [; T0 @$ l
  这篇教程要求你熟悉基础的iOS和Swift开发。如果你完全不了解iOS或者Swift,那么在看这篇教程之前,你最好看下我们网站上一些其他文章或者视频教程,然后再回来看这篇。或者是深入来学习iOS Apprentice。; D! r8 w0 X8 X& x
  这篇教程也包含了使用了Core Graphics的一些类。了解Core Graphics是一件有利的事,但不是必须的。如果你想学习更多关于Core Graphics的知识,请阅读我们的Modern Core Graphics With Swift系列。2 E' b% s3 o% `/ a) K9 M
  这篇教程要求Xcode 6.3和Swift 1.2.
" ]* f4 r: {# U$ B) F9 d  开始
" w  b) [/ k% q. l  首先你需要安装CocoaPods。幸运的是,CocoaPods被建立在Ruby上,而最近的Mac OS X版本带有Ruby。这自从OS X 10.7之后就实现了。
/ @2 |* g9 L% U, U* i( {  打开终端并且输入以下命令行:sudo gem install cocoapods
8 g3 d& |1 P/ x  {. \) G  当要求的时候输入你的密码。终端的输出结果看起来应该是这样的:+ Y( ]" J2 d  g2 e4 S- u" z; e( }
   1435559094776120.png   ?  z8 M1 w- G4 c8 p9 P$ a
  你必须使用sudo来安装CocoaPods,但是安装后就无需再使用了。
9 F. Q7 X; r9 {" q8 ?8 V( W9 J, v3 b9 G3 ^8 w
  最后,在终端输入以下命令行来完成设置:pod setup --verbose" ]: B# \. p) L
  这个过程可能需要几分钟的时间,因为它将CocoaPods Master Specs repository克隆到了你电脑上的~/.cocoapods/目录下。
1 F, l/ j' [! V7 b& M  verbose选项记录下了进程运行时的进展,能让你看到进程而不是一个僵在那里的屏幕。2 Q6 T! R. k% j- q, [. q: f9 C% O
  太好了,现在你开始设置来使用CocoaPods了。
# [8 Z  |% \6 ?/ }" B! M- ]   1435559209518036.png & F, i' U" U0 A0 {" T2 v- o
  代码时间!4 {' C, |1 |5 y# @. f, B' t
  为客户Ice Cream Shop, Inc.开发一款App- i0 |1 W0 H' }/ ?
  你的首要客户是Ice Cream Shop, Inc。他们的冰淇淋太受欢迎了以至于不能在柜台接收用户订单了。他们雇佣你来做一个漂亮的iOS应用,那样就能让用户在他们的iPhone上下订单了。
+ s2 C+ I7 ^* I3 M9 o" ~  你开始开发app了,并且进展得还不错。在这里下载开始程序。2 ^. c, y- h5 }: _
  打开IceCreamShop.xcodeproj,然后运行,你会看到一个非常好吃的香草冰淇淋。
% S8 b4 r4 ]  Z2 r% n   1435559344893906.png # ^- F' P7 _& y1 S! m
  用户应该能从这个屏幕中选择冰淇淋的口味,但是还不太可能,因为你还没有完成这个功能。
; h8 Y) ~, p' ^$ r& P2 N  从Views/Storyboards&Nibs中打开Main.storyboard来看app的布局。现在我们来快速整体地看一下这个app的核心,"选择你的口味"那一屏:$ ]; y7 }# A5 ~8 p  Q: O. ]! P  `
   1435559458539212.png : L1 a* k2 @9 `8 J
# s: H3 {/ W( U
  PickFlavorViewController处理用户交互,例如,用户选择了冰淇淋的一种口味。  r, U, i  ^" G3 D
! y2 b% ~7 {# P& c( N: o
# [- r% h; h% i
  PickFlavorDataSource是collection view所展示的不同冰淇淋口味的数据源。8 Z/ F+ R. k) _- G4 }8 K  L2 ^9 m( p

6 F/ y# X4 F+ \  IceCreamView是一个自定义的view,可以用来展示冰淇淋圆锥形的蛋卷,并且它以Flavor model来支撑。; B0 b1 g$ m% n

! s( a0 m; S+ q  ScoopCell是一个自定义的collectionviewcell,它包含了一个ScoopView,这个view也是以Flavor model来支撑的。
" P% L& P, L" V4 O% [3 O2 c  由于每个冰淇淋店一般都会有一些招牌口味,每个也有他们本地的风味。因此,Flavor的实例中包含的数据需要通过web service来提供。0 L; r6 Y7 S' W5 N: {
  然而,这还没有回答问题,"为什么用户不能选择一个冰淇淋口味?"4 S1 K! k6 |) _! g% z8 o
  在Controllers这个分组下面,打开PickFlavorViewController.swift,你会看到一个备用的方法:9 d) t6 W% i5 ]+ R# h% i
private func loadFlavors() {$ v9 L5 G/ }: j! P' O5 }6 m; i5 g$ Z
  // Implement this}% s9 s& W; L! ]9 j4 ]
  哈哈,这里面没有口味,你需要实现它。! I' y8 k- E4 u2 y' m
  你可以使用NSURLConnection或NSURLSession并用你自己写的网络类,这儿还有一个更简单的办法:Alamofire,一个开源的网络库。/ u4 R* f& D6 I: d: O
  你可能想就这么把它下载下来并将文件拖拽到工程里面。然而,那是很麻烦的方法。CocoaPods提供了更加优雅和灵活的解决方法。5 v  {: H  K& ?1 Z( D
  所以,闲话少说...# E8 c9 T" v5 i) q
1 P- E3 C2 ^! v
   1435559914957299.jpg
6 f! s; l" D/ J8 R  安装你的第一个依赖管理工具
. y* Y# l, _" n  首先你要关掉Xcode
1 [# ]2 D4 X4 R  是的,你说的对,该创建Podfile了,在那儿你要定义工程的依赖管理。
! s2 r/ E. Z: |% T: e$ g- b  打开终端,用 cd 命令进入包含你IceCreamShop项目的那个目录下:cd ~/Path/To/Folder/Containing/IceCreamShop  [7 k0 @" |: ~9 \3 b6 c7 d
  接下来,输入下面的命令:pod init
; a7 ~% k; m. N% Y  这将为你的项目创建一个PodFile
6 }( W8 ^! }- |, i7 c# O2 i5 _  输入下面的命令行打开PodFile,并使用Xcode进行编辑:open -a Xcode Podfile% d8 e* W: [: c0 c" e2 k
  注意:你不能使用TextEdit来编辑Podfile,因为它有可能用图形化的更有吸引力的typeset quotes代替standard quotes,这可能导致CocoaPods不能理解并抛出错误,所以最好用Xcode或者别的编程文本编辑器来编辑你的Podfile。
. y3 B9 @7 o6 F  M( w+ }5 Q  默认的podFile看起来是这样的:# Uncomment this line to define a global platform for your project# platform :ios, '6.0'
6 Y7 J* c7 B4 I; _$ f* o- X7 H$ Otarget 'IceCreamShop' do
% E$ n! `* ?, c- Fend
/ H' [' ^0 X: \target 'IceCreamShopTests' do 4 n# A0 k0 [9 x. ]3 @- F. [+ Q
end" i" F( R" p- L" W+ Q$ d7 \
  将注释的内容替换成下面的两行:platform :ios, "8.0"use_frameworks!
1 R  d7 u% M" Y  j1 q+ j  这就告诉了CocoaPods--你的项目使用的是iOS 8.0,并且将使用框架来代替静态库。
- y: t) Y9 s5 d9 z( e+ b  想要在Swift中使用CocoaPods,你必须明确的写出use_frameworks! 来选择使用框架。如果你忘了写这个,CocoaPods能检测到你使用使用Swift CocoaPods,你安装pods的时候就会报错。1 ], }7 Y* ]9 `9 V, C6 R& N8 l1 ?
  如果你仅仅使用过Swift编程,这可能看起来有些奇怪--那是因为Podfiel实际上使用Ruby写的。你无需为了使用CocoaPods而学习Ruby,但是你要知道即使是很小的文字错误通常也会使CocoaPods出错。
8 P3 S) c, A4 n- m- o  关于“库”( c0 v1 o9 m* H9 p
  你会看到"library"通常代指库或框架。很抱歉这个教程也在无意间混杂了这两个概念。实际上,当某人提到"Swift library",他们实际上指的是"Swift dynamic frameworks",因为swift不允许静态库。
/ d  k: Q5 {7 M7 ?% N  你可能想知道,"库(library)和框架(frameworkd)和cocoaPod之间的不同之处"。8 }; E# i: Q7 \, J
Cocoapod或者简写为"pod"是一种惯常的叫法,用来表示使用Cocoapods工具添加库或者框架到你的应用程序中。3 {, ~. i: Q. B
  iOS 8引入了动态框架,这就允许了代码、图片和其他的东西(assets)可以被一起打包。在iOS 8之前,CocoaPods被作为静态库来创建,就是很"臃肿的"二进制文件。这意味着它包含了一些代码说明设置(例如i386 for the simulator, armv7 for devices等),但是它们不允许包含任何资源,例如图片或资产。
+ T. h, j" n2 O5 _5 F4 l  另外一个重要的区别是动态框架有命名空间类,而静态库没有。所以,如果单个项目中不同的静态库里分别有一个叫做MyTestClasses的类,那么Xcode可能不能成功创建工程因为它会因重复的标识而导致连接失败。然而,Xcode很乐意在一个工程里的不同框架下分别有一个名字相同的类。
! Z, B/ D, v) p/ u  为什么这很重要?不像OC,标准的Swift运行时库(runtime libraries)没有包含在iOS中!这意味着你的框架必须包含了必要的Swift运行时库。因此,用Swift语言写的pods必须以动态框架形式创建。如果苹果允许Swift静态库,那么使用同一个标准运行时依赖的不同库中将会产生重复符号。
, ~' @0 h* g, {+ d  S  幸运的是,CocoaPods为你做了这些事。它甚至能做到一次性包含需要的依赖关系。你所要做的就是在使用swift cocoaPods时记得在Podfile中包含use_frameworks! ,那就没问题了。
9 o% q1 r5 y4 ]0 A: S% w5 g' l  amazing,对不对?
0 L; [; L, a! }+ r) H% T  安装你的第一个依赖关系* s- a% m2 y  h* c
  这是使用cocoapods安装你的依赖性文件的最后的时刻。将下面的内容添加到你的Podfile里面pod 'Alamofire', '1.2.3'  N; }( n2 d. V7 o7 F2 Q9 W
  这个是告诉CocoaPods你想添加1.1.4版本的Alamofire到你的工程中作为一个依赖性文件,这是写这篇教程时的最新版本。
- @2 D7 M* n4 q2 V0 E- {7 N  保存并关闭podFile, k  b* G0 M+ m' {; M
  现在你需要告诉Cocoapods为你的工程安装依赖性文件。在终端中输入下面的命令,但是要首先确认你还在包含了IceCreamShop和Podfile的目录下:pod install
  S: E1 V2 k" a( [- u# i0 ~) }  你会看到输出结果与下面的类似Analyzing dependencies
, D8 v0 U/ k2 d7 HDownloading dependencies7 g5 m+ a3 g; b0 G' i% j+ B
Installing Alamofire (1.1.4)Generating Pods project
$ m) M; b% N  T) F) g) iIntegrating client project3 m8 s6 N* U* W5 y
[!] Please close any current Xcode sessions and use `IceCreamShop.xcworkspace` for this project from now on.
  M" M* F2 e( z& f* N& L  使用Finder打开你的工程文件夹,你看看到CocoaPods创建了一个新的IceCreamShop.xcworkspace文件和一个Pods文件来存储所有的工程依赖文件。- l# ]% j0 ?0 Y8 |. `7 A3 s* `
  注意:从现在开始,就像命令行警告提示的,你必须使用workspace文件而不是project,否则你将遇到编译错误。" v" i% B$ k6 i# c
  太棒了!你已经使用CocoaPods添加了你的第一个依赖管理。
3 ]7 H( s# k; X6 r3 c# Y' f; Z% i$ S' R* ?
   1435561853610197.png
0 V+ F) ~0 r& ~) ^! ~  使用安装好的Pods; y  o. p) ]) M2 s8 V8 T
  如果已经打开了Xcode工程,那要关闭它并打开IceCream.xcworkspace.2 i+ ]8 n5 Z/ g! V
  打开PickFlavorViewController.swift,在现有的导入下添加以下代码:import Alamofire. w; {  d9 _$ ^& V+ L- P! c
  点击command+b进行编译。如果一切都没有问题,你不会收到任何编译错误的。
3 p  J5 }* ~& {2 Y+ d( p" n  接下来,用下面的代码代替loadFlavors()方法private func loadFlavors() {4 U3 h5 H, d4 m- D" S
  let urlString = "http://www.raywenderlich.com/downloads/Flavors.plist"   // 1- {6 X" e5 U& |" w$ a
  Alamofire.request(.GET, urlString, encoding: .PropertyList(.XMLFormat_v1_0, 0))6 A5 W% {4 [3 `; Z' r) L
    .responsePropertyList { request, response, array, error in     // 2
% F& c: C/ w* P6 t    if let error = error {
/ ~7 z5 S& r( z) b! S  J7 h      println("Error: \(error)")     // 3! D7 @+ B* P; H
    } else if let array = array as? [[String: String]] {       // 46 C* @1 j1 ^, U
      if array.isEmpty {  {: Y/ s- a4 _+ u/ o7 b
        println("No flavors were found!")       // 56 w) M3 |0 N* Q3 W7 g3 B; D  E
      } else {! b- _& w9 |/ w% a8 y
        self.flavors = self.flavorFactory.flavorsFromDictionaryArray(array)
) I3 ]) s* j4 g3 k9 u) b        self.collectionView.reloadData()
8 [* B0 r; `: U" a: P        self.selectFirstFlavor()
0 N. L1 J- K, r' @( z      }: w7 m$ M: T3 f% }+ o5 B8 G* R1 T
    }/ O9 U% I& U, J7 X1 _% @% s5 x) M
  }}) Q- R6 S$ c8 w- _& c2 n. c
  下面是对这个过程的详细描述:
& y. ?! K; P5 z  1.你用Alamofire创建了一个get请求,并下载了一个包含冰淇淋口味的plist文件。' |& r& I2 ]; @2 j
  2.一般你去看查看请求是否出错并解析错误。现在如果出错的话你只需要打印错误。0 U. H, c) u/ r( }
  3.将一个AnyObject?类型数组转换为字典数组。
" t) ~* y: |( L6 x: Y; ^  4.如果数组是空的,你只需要打印一个错误信息。1 k: {8 W& |9 u" S& u; O
  5.如果一切都OK的话,你就将FlavorFactory方法创建的包含Flavor对象的数组赋值给self.flavors。这是一个同事为你写的类,是用来将装了字典类型对象的数组转换为Flavor对象。如果你喜欢的话你可以仔细看看这个工厂类,但是它对教程的其他部分不是特别重要。
% U; z; J1 [2 |  编译并运行!现在你可以选择一个冰淇淋口味了!# A) T8 d$ _/ @6 S; F( S
   1435562294590824.png ' n: ^/ t3 u2 r7 n! U
  选择装饰物
) |5 k7 ?) O2 x2 W  app看起来很不错了,但是你仍然可以进行优化。
5 C& ?- O. Y) K" \  你有没有注意到app花费了几秒钟的时间来下载flavors文件?如果你的网络很快的话你可能注意不到,但是用户不会都这么幸运的。
* y$ D5 Q2 t* L: Y: u6 l/ i7 _  为了让用户理解app现在正在加载什么内容,你可以显示一个加载指示器。MBProgressHUD是个很不错的加载指示器.并且它支持CocoaPods,多么的巧合!
# o' Y  ^: w0 R  B. E: \  你需要把这个加入到你的podfile里面。你现在不用通过命令行打开podfile了,你可以在工作区的pods中找到它。
) R& T+ \5 E4 y8 k   1435562479955282.png - K6 I$ M' A1 C; \- ?) `2 r/ s
  打开podFile并在Alamofire后面加入下面几行:; e5 [; A+ [6 W9 J
pod 'MBProgressHUD', '~> 0.9.0'
8 h  a1 _7 u' ]  保存文件,并在终端通过pod install命令来安装依赖文件,就像你之前做的那样。
) x2 k8 ?' h: x5 y& `& _$ [& Z  这次发现什么不同的了吗?对,你写出了具体的版本号~>0.9.0。这儿会发生什么呢?$ s9 H$ g( D, i% Z% f9 A6 U0 f+ U* D1 N
  Cocoapods建议所有的pods都使用语义化版本号(Semantic Versioning)。+ \( }9 d; \- p( z5 b* `
  语义化版本号5 b0 U  L6 j3 y( J$ G
  这三个数字被定义为主要的,次要的和补丁版本号。例如,版本号0.9.0会被翻译为4 _% x7 W/ F! j# G& l$ B  o
   1435562643385337.png
. G* U9 @# Z/ ~& q( Z& z  当主要的(major)版本号数字增加时, 意味着你做了一些不能兼容旧版本的更新。当你将pod升级到下一个主要版本时,你可能需要修复编译错误,否则pod可能跟之前表现得不太一样。
2 z8 m6 F: x1 U% ?' Y& w  当次要(minor)版本号增加时,意味着增加了新功能,但同时兼容旧版本。当你决定升级时,你可能需要也可能不需要新的功能,但是它不应该引起编译错误或者改变现有的功能。
/ x7 ?0 T3 e  G7 Z4 u5 P  当补丁(patch)版本号增加的时候,这意味着做了bug修复。但是没有没有增加也没有改变功能。一般来说,你会希望尽快更新补丁版本到最新的版本,以便使用最新最稳定版本的pod。
, \, E$ x2 z$ \) `8 F! H8 W; l  最后,最高版本号(major>minor>patch)必须按照以上规则逐步增加,而较低的版本号必须从0开始。
" C/ r* g" t& |* i- Q  需要一个例子吗?
5 h( n% [. g2 S! y  考虑一个当前版本为1.2.3的pod。) w4 a0 v" u9 I0 F- L/ |: m' v2 U) e
  如果做了一些不能向后兼容的改变,没有新的功能,但是修改了现有的bug,那么下一个版本是2.0.0
" h7 }' M* i0 q0 J$ K9 ^  挑战时间* r, I, \- X: y% o5 h2 R
  1.如果一个pod当前版本号是2.4.6,并且做了一些修复bug的改变,添加了一些向后兼容的功能,新版本应该是多少呢??
& Q3 m3 M) p2 B5 s8 U. c  答案:2.5.0: e6 a: g! Q+ a, V2 k! c
  解释:如果修改包含向后兼容的新功能,次要版本号(monir)就要增加了,并且补丁版本号(patch)就要被置为0.
, C% J9 X- W( h- T! n) B% P% r  2.如果一个pod的当前版本是3.5.8,并且对当前的功能做了一些改变,新版本应该是多少?
: l1 D) ~6 c4 ^* Y  答案:4.0.0
. Z" s5 L5 n' {4 P: O- h  解释:如果改变修改了现有的功能,那么这就是不向后兼容的。所以,主要版本号(major)必须增加,而次要版本和补充版本置为0.
/ y3 N) S5 w  P8 w6 e" H  3.如果一个pod的向前版本号是10.20.30并且只修复了一些bug,那么新版本号应该是多少?
- h# Q8 i# ^$ G  答案:10.20.314 r4 m$ u4 |, u, t
  解释:如果只修复了bug,补充版本号(patch)就要增加了。
6 p7 E8 B% n% e  说了这么多,这儿有一个例外:8 c+ Z& a1 K8 ^7 J6 G7 T
  如果一个pod的版本低于1.0.0,这就被认为是测试版,次要版本号(minor)增加可能意味着向后兼容的改变。
) E1 x+ |' q! X  F; ~) n# n  所以在MBProgressHUB中使用~>0.9.0意味着你需要安装大于或者等于0.9.0但是小于0.10.0的最新的版本.
5 O% R* p- ]: V) |0 p' d% Q0 @  这就保证了你在安装pod的时候获得了最新的bug修复,但是不会意外的拉去向后兼容的改变。这儿还有一些其他的可用操作。具体的列表,请看Podfile Syntax Reference。
2 W7 v- i) L+ G- Q5 N  显示进程
# Q# N$ z4 X9 V- ^  现在,回到PickFlavorViewController.swift,在其他的引用下面添加下面的内容import MBProgressHUD$ f( @* {9 ?9 ?
  下一步,在loadFlavors()后面加入以下方法private func showLoadingHUD() {5 D$ ~' v& m: P( y+ |) ~0 k/ |& Z
  let hud = MBProgressHUD.showHUDAddedTo(contentView, animated: true)
) Q% H9 ]- r, K! U7 A0 u7 h3 _! w  hud.labelText = "Loading..."} 0 \( S2 s2 O  e, U" X
private func hideLoadingHUD() {
- F& \% T& m9 q4 n8 w0 X  MBProgressHUD.hideAllHUDsForView(contentView, animated: true)}( A% _1 ]$ Y6 F# Q# r9 M3 }
  现在在loadFlavors()方法中,添加下面代码:private func loadFlavors() {5 \* |- W+ h0 |# u# N
    let urlString = "http://www.raywenderlich.com/downloads/Flavors.plist"
. \4 {4 S/ Y! ^. ^3 \' m6 Z# w3 h    showLoadingHUD()  //       .responsepropertylist { request, response, array, error in       self.hideloadinghud()  // 1 T; j3 F5 H  \- k4 z5 T9 a8 u
  就像方法名字所表明的,showLoadingHUD()方法会在GET请求下载时产生一个MBProgressHUD的实例对象,当请求结束时hideLoadingHUD()会将HUD隐藏。由于showLoadingHUD()在闭包之外所以它不需要前置代码self。
. U$ M: K" D) N# H$ x  编译运行。现在你会看到一个加载指示器:
回复

使用道具 举报

dong2008hong | 2015-7-12 10:30:59 | 显示全部楼层
1435565166988259.png $ L( ?) u. L0 R+ L) @
  干的漂亮!用户现在可以选择他们最喜欢的冰淇淋口味了,并且在口味文件下载的时候会显示一个正在加载的指示器。* O0 S: s: z  H! a5 p0 f, ]
  下一步
- O, Y# Y2 a0 z. L* s% m" ^7 v" z  你可以从这儿 下载完整的项目
: A4 ~3 [6 m9 ^' r8 _  恭喜你,现在你已经学会了使用cocoapods的基础,包括创建和修改依赖性文件,并且理解了语义化版本号。现在你可以准备开始在你自己的项目中使用他们了。* B0 d4 e2 G+ [- T+ c
  当然你 还可以用cocoapods做很多别的事。你可以在Cocoapods官方网站上搜索现有的pods。也可以参考Cocoapods指南去学习如何使用这个杰出工具的更多细节内容。但是要记住,一旦你开始使用你会好奇你曾经是怎么不用它来进行管理的!
7 T+ N! r, q8 l1 }# N  希望你享受阅读这篇教程的过程我写的时候。
3 r0 a3 y; k+ A; ?% `  你最喜欢cocoapods的那些部分?哪一部分是你每天的项目最依赖的?请在下面的评论或者论坛中分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则