【編者按】本篇文章作者是Reinder de Vries炸宵,既是一名企業(yè)家辟躏,也是優(yōu)秀的程序員,發(fā)表多篇應(yīng)用程序的博客焙压。本篇文章中鸿脓,作者主要介紹了如何基于Parse特點(diǎn),打造一款類似Instagram的應(yīng)用涯曲,完整而清晰的步驟野哭,為開發(fā)者提供一次絕佳的學(xué)習(xí)體驗(yàn)。本文系 OneAPM 工程師編譯整理幻件。
Parse 是一個移動應(yīng)用開發(fā)平臺拨黔,旗下有個很有意思的產(chǎn)品:Parse Core。它的特色之一是允許應(yīng)用開發(fā)者直接將數(shù)據(jù)存儲在云端绰沥,而無需擔(dān)心設(shè)置服務(wù)器或重新設(shè)計(jì)一個 REST API篱蝇。Parse Core 是本地備份(比如核心數(shù)據(jù))贺待,這使得它能輕松解決線上線下等后端問題。

本篇教程主要介紹如何創(chuàng)建一個基于 Parse 的應(yīng)用。我們將打造一個類似 Instagram 的應(yīng)用涧衙,它包括以下特征:
- 從 Parse 加載數(shù)據(jù)哪工,存儲在本地;
- 保存數(shù)據(jù)到 Parse弧哎,并寫回云端雁比;
- 為 Cat 的圖片點(diǎn)贊。
這款應(yīng)用將完全使用 Swift 語言開發(fā)撤嫩,Swift 是蘋果最新的編程語言偎捎,用于打造 iOS 應(yīng)用。Parse 并不用完全重寫 Swift序攘,所以我們需要創(chuàng)建一個橋接頭來處理它倆的兼容性茴她。
通過這篇文章你將學(xué)到以下技能:
- 用 Parse 實(shí)現(xiàn)檢索,存儲數(shù)據(jù)到云端两踏;
- Cocoapods 整合一個調(diào)用 Objective-C 框架的 Swfit 程序败京;
- 建立視圖和有接口的自定義表視圖單元;
- 從零開始梦染,用 Swift 編寫一個完整的 App;
- 使用自動布局和約束朴皆;
- 使用手勢識別帕识、可選類型、條件遂铡、閉包肮疗、屬性、出口和動作扒接。
那開始吧伪货!
首先,你得有一個 Parse 帳戶钾怔。這可以通過你的 Facebook碱呼、Google+、GitHub 帳號或郵件在 Parse.com 注冊宗侦。
然后愚臀,登錄 Parse,通過 https://www.parse.com/apps 可以到你的 apps Dashboard矾利。
通過點(diǎn)擊「創(chuàng)建新應(yīng)用」 按鈕姑裂,創(chuàng)建一個新的應(yīng)用程序馋袜,輸入「Paws」作為應(yīng)用名。接著舶斧,打開新應(yīng)用欣鳖,確保你能看到下圖的的核心選項(xiàng)卡。

創(chuàng)建數(shù)據(jù)存儲區(qū)
從技術(shù)上說,Parse 只是在線數(shù)據(jù)庫呀忧。數(shù)據(jù)被存儲為具有一個名稱和多個字段的對象师痕,如電子表格。這樣的對象被稱為一個類而账,它的功能是數(shù)據(jù)結(jié)構(gòu)的藍(lán)圖胰坟。我們將要使用的類名為 Cat。
在核心選項(xiàng)卡單擊該按鈕添加一個類泞辐。在下拉框中選擇自定義笔横,然后鍵入類的名稱:Cat。然后咐吼,單擊創(chuàng)建類吹缔。

這樣,我們就創(chuàng)建了新的類锯茄,接著我們還可以添加一系列的標(biāo)準(zhǔn)字段厢塘,如 ObjectId、createdAt肌幽、updatedat和ACL晚碾。
將+Col
按鈕翻到最上,添加下列字段喂急,名稱和類型:
- Name: name, type: String.
- votes, type Number.
- url, type String.
- cc_by, type String.
這些字段將為 Cat 數(shù)據(jù)庫提供基本信息格嘁。
導(dǎo)入數(shù)據(jù)
現(xiàn)在我們已經(jīng)設(shè)置好基礎(chǔ)結(jié)構(gòu),可以導(dǎo)入數(shù)據(jù)了廊移!將該文件保存到:cat.json糕簿。
然后,回到核心選項(xiàng)卡和數(shù)據(jù)庫狡孔,左鍵點(diǎn)擊「導(dǎo)入」按鈕懂诗。選中你剛保存的文件并上傳。確保類別集是「自定義」 步氏,并重命名為 Cat(而不是rs1_cat)响禽。再單擊「完成導(dǎo)入」。如果導(dǎo)入是完整的,Parse 會及時提示芋类。點(diǎn)擊「Got it」并重新加載頁面隆嗅。
如果一切順利,你現(xiàn)在應(yīng)該能看到數(shù)據(jù)庫中有10個 Cat侯繁。它們都有一個名字胖喳、一個 URL、一些得票數(shù)和一些為原則這預(yù)留的空間贮竟。

至此咕别,我們在 Parse 中的全部工作已經(jīng)完成技健。下面開始構(gòu)建 Swift Xcode 程序。
構(gòu)建 Xcode
打開 Xcode 并創(chuàng)建一個新項(xiàng)目惰拱,從開始界面選擇「菜單→新建→工程」雌贱。
選擇類別「iOS→應(yīng)用模板」的單一視圖的應(yīng)用。在下一屏上輸入以下字段:
- 產(chǎn)品名稱:Paws
- 結(jié)構(gòu)名稱:隨意
- 結(jié)構(gòu)標(biāo)識符:隨意偿短,比如com.appcoda
- 語言:Swift
- 設(shè)備:通用
單擊「下一步」 欣孤,選擇工程目錄文件夾,再單擊「創(chuàng)建」 昔逗。
我們不打算使用 Storyboards降传,所以單擊左上的 Paws、2 targets勾怒、 iOS SDK婆排,打開工程設(shè)置。在左側(cè)的列表中單擊 Target 下方的 Paws笔链,然后找到屏幕中主區(qū)域的主界面設(shè)置泽论。將 textMain 從框中移除。

用 Cocoapods 將 Parse 庫添加到 Xcode 項(xiàng)目
在程序代碼中使用 Parse 之前缚够,我們必須將其添加依賴關(guān)系幔妨。因此我們選擇 Cocoapods,它是一個軟件包管理器谍椅。許多應(yīng)用項(xiàng)目依賴于第三方庫误堡,比如 Parse。CocoaPods 是方便加載庫的工具雏吭,并確保其實(shí)時更新锁施。
在終端執(zhí)行以下命令安裝 Cocoapods。它會要求你輸入你的 Mac 用戶密碼。但不允許包含「$」符號悉抵。這標(biāo)志意味著 shell 命令肩狂!
$ sudo gem install cocoapods
中途如果一兩分鐘沒有進(jìn)展也無需擔(dān)心,那是因?yàn)?Cocoapods 正在安裝中姥饰。安裝完成后你可以看到一堆線條傻谁,最終...安裝完成。

接下來,在 Xcode 項(xiàng)目的根目錄下創(chuàng)建一個空文件岂座,并調(diào)用 Podfile 文件态蒂。用你喜歡的文本編輯器打開,并粘貼下面代碼到該文件:
pod ‘Parse’, ‘~> 1.7.1′
pod ‘ParseUI’, ‘~> 1.1.3′
Podfile 會告知 Cocoapods 哪些庫是我們需要的费什。這樣的話钾恢,Parse 的版本是1.7.1,而ParseUI版本是1.1.3吕喘。
現(xiàn)在赘那,關(guān)閉 Xcode,并使用終端找到程序項(xiàng)目的根目錄氯质。寫入終端 cd募舟,然后在 Paws 目錄中查找,并將其拖至終端闻察。
接下來拱礁,在命令行輸入以下代碼:
$ pod install
CocoaPods 會查找 Podfile,并嘗試安裝我們設(shè)置的依賴關(guān)系辕漂。這個步驟大概會花上幾分鐘呢灶。結(jié)果應(yīng)該是這樣:

CocoaPods 已經(jīng)下載并編譯 Parse鸯乃,并把它添加到一個新的工作區(qū)。從現(xiàn)在開始跋涣,我們不再使用原來的應(yīng)用項(xiàng)目缨睡,而會使用 CocoaPods 創(chuàng)建的工作區(qū)。它包含了我們的原始項(xiàng)目和 CocoaPods 項(xiàng)目陈辱。
這里要注意的是:通過搜索瀏覽找到程序的根目錄奖年,打開 Xcode 中的新工作區(qū),再打開其中的 Paws.xcworkspace沛贪。驗(yàn)證下左側(cè)的導(dǎo)航項(xiàng)目陋守,會看到:Pods 和 Paws震贵。
在我們直接編寫應(yīng)用前,需要建立 Parse 和項(xiàng)目之間的連接水评。Parse 是用 Objective-C 搭建的猩系,而我們的項(xiàng)目則是用 Swift 語言,兩者之間需要適當(dāng)?shù)脑O(shè)置才能兼容之碗。
在 Swift 項(xiàng)目中使用 Objective-C
任何 Objective-C 庫蝙眶、項(xiàng)目或類都可以通過設(shè)置橋接頭才能與 Swift 兼容。從技術(shù)上講褪那,這樣的橋接將 Objective-C 的頭文件轉(zhuǎn)換成 Swift 語言幽纷。
創(chuàng)建一個橋接頭需要執(zhí)行以下操作:
1.在 Paws 目錄添加一個新文件,選擇 Paws 工程下的 Paws 目錄博敬,單擊右鍵友浸,然后單擊「新建文件」。
2.從「iOS→源」類別中選擇Objective-C文件模板并單擊「下一步」偏窝。
3.將類命名為「Paws」(或其它你喜歡的名字)收恢,然后繼續(xù)進(jìn)行并保存文件。出現(xiàn)提示時祭往,單擊「是」來配置 Objective-C 橋接頭伦意。

Xcode 創(chuàng)建兩個新文件:Paws.m 和 Paws-Bridging-Header.h驮肉。Paws.m 文件沒什么用,你可以直接將它刪除已骇。在 Paws-Bridging-Header.h 文件中寫入以下代碼:
#import <Parse/Parse.h>
#import <ParseUI/ParseUI.h>
#import <Bolts/Bolts.h>
看到這里离钝,你不禁會問難道這一大堆工作只是為了建立一個編程項(xiàng)目么?別擔(dān)心褪储,我們接下來就來搞點(diǎn)有趣的卵渴。請記住:Parse 提供一個現(xiàn)成的在線后端鲤竹,能節(jié)省大量時間浪读!
驗(yàn)證 Parse 是如何工作的
通過 https://parse.com/apps,返回 Parse 的 Dashboard辛藻。將鼠標(biāo)懸停在你帳戶名的右上角瑟啃,單擊帳戶,再單擊應(yīng)用鍵標(biāo)簽最上面一欄揩尸。你還可以直接訪問 https://parse.com/account/keys。
確定應(yīng)用的 Parse 網(wǎng)絡(luò)服務(wù)后屁奏,該頁面將顯示你的應(yīng)用鍵岩榆。應(yīng)用鍵由一串字母數(shù)字或字符組成,基本上這就是應(yīng)用的密碼,要注意保密勇边。
接下來犹撒,在 Xcode 中打開文件 AppDelegate.swift。找到應(yīng)用程序的 didFinishLaunchingWithOptions 方法粒褒。
添加以下代碼到方法中识颊,確保它在該方法的首行。完整的是這樣:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
Parse.setApplicationId("...", clientKey: "...")
return true
}
用 Parse 的應(yīng)用鍵分別替換「...」
- 第一個奕坟,應(yīng)用 ID
- 第二個祥款,客戶端密鑰
之后,嘗試運(yùn)行應(yīng)用程序:
1.確保選擇正確的設(shè)備月杉,通過確認(rèn)PLAY
按鈕的右上方刃跛,確保設(shè)備選擇,比如 iPhone 或 iPhone6苛萎。
2.然后桨昙,點(diǎn)擊Play
按鈕或按下 Command-R 運(yùn)行程序。
項(xiàng)目在構(gòu)造腌歉、運(yùn)行過程中沒有錯誤蛙酪。一旦運(yùn)行,你可以看到 iPhone 會出現(xiàn)有一個黑色的窗口翘盖,但窗口上卻什么都沒有——這是因?yàn)槲覀円瞥酥黜撁婺_本桂塞,還沒有替換。
值得高興的是:你已經(jīng)成功用 Parse 和 CocoaPods 配置好你的項(xiàng)目了最仑!
創(chuàng)建表視圖控制器
為了顯示出 Paws 應(yīng)用中的 Cat 圖片藐俺,我們需要使用一個表視圖控制器。這是非常常見的 iOS 接口元件泥彤,能在垂直列表中展示各行數(shù)據(jù)欲芹。顯而易見的例子就是 iPhone 上的聯(lián)系人應(yīng)用中人和號碼的垂直列表。在 Objective-C 和 Swift 中吟吝,一個表視圖控制器本身就是 UITableViewController 類菱父。
注:陌生的術(shù)語類?把它當(dāng)作原型剑逃,也就是你在鐵鑄件時用的模具浙宜。你把鐵倒入模具,就出來一個副本蛹磺。這種復(fù)制被稱作該類的一個實(shí)例粟瞬。
Parse 有個很棒的對應(yīng)叫 ParseUI,是 UI 元素集合萤捆,能與 Parse 產(chǎn)品緊密結(jié)合裙品。我們即將使用 PFQueryTableViewController 類俗批。它用 Parse 數(shù)據(jù)擴(kuò)展 UITableViewController 類的功能。這簡直是完美的結(jié)合市怎。
創(chuàng)建一個名為 catstableviewcontroller 的 Swift 新類岁忘。在項(xiàng)目瀏覽器中,右鍵單擊 Paws 目錄并選擇新文件区匠。從「iOS→源」干像,選擇 Cocoa Touch 類模板。輸入以下設(shè)置:
- 類:CatsTableViewController
- 繼承:PFQueryTableViewControlle
- 語言:Swift
- 確保創(chuàng)建 XIB 文件處于未選中狀態(tài)

保存文件到 Paws 目錄。選擇目錄時揩懒,請確保 Paws 作為目標(biāo)被選中什乙。
打開新類文件,可以看到的基本結(jié)構(gòu):一個名為 viewDidLoad已球;另一個名為 didReceiveMemoryWarning臣镣。需要注意的是,CatsTableViewController 擴(kuò)展 PFQueryTableViewController智亮,是它的子類忆某。反過來,PFQueryTableViewController 類是 UITableViewController 的擴(kuò)展阔蛉,所以我們的表視圖控制器將繼承所有表視圖功能弃舒,同時可用 ParseUI 添加代碼和功能。
編碼表視圖控制器
首先状原,我們必須重寫類的構(gòu)造方法來配置基礎(chǔ)設(shè)置聋呢。
將以下兩種方法添加到類的頂部,在文件的第一個大括號之后:
override init(style: UITableViewStyle, className: String!)
{
super.init(style: style, className: className)
self.pullToRefreshEnabled = true
self.paginationEnabled = false
self.objectsPerPage = 25
self.parseClassName = className
}
required init(coder aDecoder:NSCoder)
{
fatalError("NSCoding not supported")
}
你剛添加了兩個方法:
- 指定初始化的 init颠区,這需要兩個參數(shù):表視圖的風(fēng)格和我們要使用的 Parse 類名(在這里是 C)
- 必需的初始化削锰,需要一個參數(shù):NSCoder 的一個實(shí)例。現(xiàn)在為止毕莱,它的內(nèi)容是不相關(guān)的器贩,堅(jiān)持做下去,但不要求你創(chuàng)造性地使用該方法朋截。
在最初的初始化中蛹稍,完成了下列事項(xiàng):
1.當(dāng) super.init()調(diào)用時,初始化父類 PFQueryTableViewController部服,從而完成自身初始化唆姐。
2.接著,pullToRefreshEnabled 設(shè)置為 true廓八,繼承 PFQueryTableViewController 類厦酬。特殊變量 self 指當(dāng)前作用域胆描,為該類的實(shí)例。
3.隨后仗阅,我們禁用分頁,并設(shè)置表對象的最大數(shù)目為25国夜。
4.最后减噪,在實(shí)例屬性 parseClassName 中存儲參數(shù) className。
之后车吹,當(dāng)我們創(chuàng)建 CatsTableViewController 類的實(shí)例筹裕,這個構(gòu)造(或指定初始化)將是表示圖控制器被調(diào)用和設(shè)置的基礎(chǔ)。
用 queryForTable 編碼數(shù)據(jù)檢索
通過 PFQueryTableViewController 實(shí)現(xiàn) Parse 表視圖的核心是方法 queryForTable窄驹。我們繼承該方法時朝卒,繼承的實(shí)際上是 PFQueryTableViewController,所以需要對其進(jìn)行重寫:需要連接表視圖控制器到 Parse 數(shù)據(jù)存儲區(qū)時乐埠,PFQueryTableViewController 會調(diào)用它抗斤。它從表中查詢數(shù)據(jù),因此該方法名為 queryForTable丈咐。在該方法中瑞眼,我們可以自定義檢索。
添加此方法到 CatsTableViewController 類(在 viewDidLoad 方法下)棵逊。注意這些括號匹配伤疙!
override func queryForTable() -> PFQuery {
var query:PFQuery = PFQuery(className:self.parseClassName!)
if(objects?.count == 0)
{
query.cachePolicy = PFCachePolicy.CacheThenNetwork
}
query.orderByAscending("name")
return query
}
來看看這個新方法:
override func queryForTable() -> PFQuery
其中包含了什么?編寫新方法 queryForTable辆影,告知編譯器以下事項(xiàng):
1.用相同的名字覆蓋父類方法(識別標(biāo)志)徒像,使用語句覆蓋。
用 func 和名字聲明該方法蛙讥,queryfortable锯蛀。
2.聲明 methsignatureod 之間的參數(shù)。本例中沒有參數(shù)键菱。
3.最后選擇「Write→ PFQuery」谬墙,返回方法類型。
在方法內(nèi)發(fā)生了下列變化:
1.聲明一個新變量調(diào)用查詢经备,需要一個命名參數(shù)的類名拭抬,用于實(shí)例化構(gòu)造函數(shù)的方法,被分配的 self.parseclassname 值侵蒙。換句話說造虎,表的類名是 Cat,利用 Cat 實(shí)例創(chuàng)建查詢纷闺。
2.然后算凿,如果查詢是空份蝴,在查詢中設(shè)置 CachePolicy 屬性。它的值是連續(xù)的 PFCachePolicy.CacheThenNetwork氓轰,這意味著該查詢婚夫,首先在脫機(jī)緩存中尋找對象,如果沒有找到署鸡,它會從在線 Parse 數(shù)據(jù)存儲中下載對象案糙。當(dāng)表視圖終于顯示在應(yīng)用界面上,這時 if 語句便成功執(zhí)行靴庆。
3.然后时捌,我們以「名稱」列為查詢對象。
最后炉抒,返回查詢結(jié)果奢讨。(未完待續(xù)...)
敬請持續(xù)關(guān)注:《如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用》系列(2)(3).
原文地址:Building an Instagram-Like App with Parse and Swift
本文系 OneAPM 工程師編譯整理。OneAPM 是應(yīng)用性能管理領(lǐng)域的新興領(lǐng)軍企業(yè)焰薄,能幫助企業(yè)用戶和開發(fā)者輕松實(shí)現(xiàn):緩慢的程序代碼和 SQL 語句的實(shí)時抓取拿诸。想閱讀更多技術(shù)文章,請?jiān)L問 OneAPM 官方博客蛤奥。