前邊以及陸陸續續的介紹了使用Swift3.0開發的服務端應用程式的Perfect架構。本篇部落格就做一個階段性的總結,做一個完整的執行個體,其實這個執行個體在《Swift3.0服務端開發(一)》這篇部落格中已經簡單的介紹過了,本篇部落格就來詳細的聊一下這個工程的具體實作細節。當然包括iOS端和服務端的代碼。本篇部落格的介紹順序按照功能子產品來劃分的,如登入注冊子產品、記事本清單,記事本的增删改查等功能。在每個功能子產品,我們先給出服務端代碼的實作,然後給出用戶端代碼的實作。
本篇部落格的前幾部分主要介紹整個工程的公用子產品,為工程的實作做準備,下方就是我們今天部落格要做的東西。本篇部落格iOS端的網絡請求主要使用的NSURLSession來實作的,關于URLSession更詳細的介紹請參考之前釋出的部落格《NSURLSession全家桶》

一、記事本資料庫的設計
資料庫的設計以及資料庫表的建立我都使用Sequel Pro來實作的,關于Sequel Pro的使用請看上篇部落格的介紹,本篇部落格關于Sequel Pro的介紹就不做過多贅述了。首先我們先給出記事本資料庫表的設計,以備使用。我們先建立一個名為perfect_note的資料庫(步驟略),然後再建立相應的資料庫表。因為我們的記事本比較簡單,主要包括登入、注冊以及記事本的增删改查。是以我們的資料庫結構也是比較簡單的,perfect_note資料庫中隻有兩個表,一個是user表,一個是content表,下方會給出詳細的介紹過程。
1.user表的建立
首先我們來建立user表,user表負責存儲使用者資訊,當使用者注冊和登入時都會操作這個表。注冊使用者時就是往該表中插入使用者,登入時就是查詢相應的使用者資訊。當然,為了Demo的簡潔性,我們的user表中的字段也是比較少的。下方就是建立user表的SQL語句。其中有四個字段,主鍵id是整型而且是自增的,是使用者的唯一表示。username字段存儲的是使用者名,password存儲的就是使用者密碼。register_date存儲的是使用者注冊時間,是時間戳,并且預設值是目前時間。
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(30) CHARACTER SET latin1 NOT NULL DEFAULT '',
`password` varchar(30) CHARACTER SET latin1 NOT NULL DEFAULT '',
`register_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
2.content表的建立
建立完user表後,接下來就要建立我們的content表了。content表用來存儲使用者錄入的筆記,下方就是content表的建立SQL語句。從下方的SQL語句中不難看出content表的字段包括自增的主鍵id,記錄的标題title,記錄的内容content,以及外鍵userID和建立時間create_time。
CREATE TABLE `content` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(30) CHARACTER SET gb2312 NOT NULL DEFAULT '',
`content` text CHARACTER SET gb2312 NOT NULL,
`userID` int(11) unsigned NOT NULL,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `USER_FOREIGN_KEY` (`userID`),
CONSTRAINT `USER_FOREIGN_KEY` FOREIGN KEY (`userID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
二、iOS端基于NSURLSession網絡請求類的封裝
建立完資料庫後,接下來我們來封裝iOS端網絡請求的共用代碼。也就是說,iOS端的網絡請求就會調用本部分封裝的内容。當然本部分封裝的網絡請求類是使用NSURLSession類封裝的。
1.字元串常量、閉包回調類型以及枚舉的定義
首先我們先來定義一些封裝網絡請求類要使用的字元串常量以及枚舉閉包回調。下方代碼段做的就是這件事情,第一個框中定義了解析響應資料時使用到的字元串常量。“SUCCESS”表示請求成功,“FAILE”表示請求失敗等等。
第二個框中定義的是三個閉包變量,用來将請求結果回調給調用者。RequestStart就是開始請求要調用的閉包類型,RequestSuccess則是請求成功後調用的閉包類型,RequestFailed則是請求失敗要調用的閉包類型。這三者是請求類對外交流的橋梁。
第三個框則是請求方式的枚舉,主要包括GET、POST、PUT、DELETE,當然還留了CUSTOM()自定義的擴充類型。在該枚舉中的description計算屬性負責将目前的枚舉對象轉換成其對于的字元串,具體如下所示:
2、網絡請求基類的建立
接下來網絡請求的基類,所有與網絡請求相關的類都要繼承自此類,下方的BaseRequest就是我們網絡請求的基類。該類比較簡單,主要聲明了上面定義的三個閉包類型的變量,然後給出了相應的構造器。具體如下所示。
3.網絡請求類的封裝
接下來我們使用NSURLSession來封裝我們的網絡請求類,下方的Request類就是我們封裝的網絡請求類,該類繼承自BaseRequest。下方是Request的部分代碼,下方每個方法對應着GET、POST、PUT等請求,可以結合者REST一起使用。在每個具體請求的方法中會調用sessionDataTaskRequest()方法。會給這個方法傳入不同的請求方式以及路徑和參數。稍後我們會給出sessionDataTaskRequest()方法的具體實作,sessionDataTaskRequest()方法其中就使用了NSURLSession相關的内容發起了網絡請求,具體請看下方對sessionDataTaskRequest()方法的詳細介紹。
下方這個代碼段就是sessionDataTaskRequest()方法的整體結構,首先我們根據函數的請求路徑和參數拼接URL字元串,也就是第一個框中的部分。在該部分中的query()函數是将參數進行URL編碼轉換,這個函數是從AlamoFire架構中摘過來的。然後建立請求用的URLRequest對象。最後是建立Session對象發起DataTask任務了。當然請求的結果是在completionHandler閉包中進行處理,稍後會給出completionHandler閉包中的處理方式。
接着,我們給出請求成功後,對json資料的解析以及對傳回結果的處理。下方就是completionHandler閉包中的代碼片段。首先對伺服器傳回的json資料進行解析,解析後将json資料轉換成對應的資料類型。然後根據響應封包的result字段來進行相應的操作。如果封包響應正常,就調用success()閉包,否則調用failure()閉包,如下所示:
至此我們iOS用戶端的網絡請求部分就封裝完了,其他具體業務邏輯的網絡請求調用上述的Request類即可,稍後會用到Request。
三、登入注冊子產品的開發
上面的基礎工作完畢後,接下來我們就要來做我們相應的業務子產品了。首先我們來進行登入注冊子產品的開發工作。 首先給出服務端相應子產品的代碼,然後在給出相應子產品的iOS端的實作。關于Swift3.0連接配接和操作MySQL的詳細内容請參考上一篇部落格《Swift3.0服務端開發(四) MySQL資料庫的連接配接與操作》,資料庫的連接配接在本部分就不做過多贅述了。
1、服務端代碼
(1)、登入或注冊的第一步:接收使用者名
下方代碼是使用者登入或者注冊的第一步,通過使用者名來查詢使用者資訊,進而來判斷該使用者是否注冊,如果未注冊則去注冊,如果注冊過就去登入。如果查詢成功,那麼就将查詢的使用者ID和UserName傳回給用戶端。使用者登入的代碼和下方差不多,就是通過Select語句來比對該使用者名的密碼是否與使用者輸入的一緻,在此就不做過多贅述了。
(2)、使用者注冊
下方就是使用者注冊是調用的接口實作,主要是插入相應的使用者資訊,具體如下所示:
上面這些代碼寫完後,配置完相應的路由調用上述方法,我們的服務端代碼就完成了。具體路由的配置因為篇幅有限,本篇部落格就不做過多贅述了。
2、iOS用戶端代碼實作
接下來我們來實作iOS用戶端的登入和注冊的代碼,下方就是登入或者注冊的相關UI。使用者輸入使用者後,點選下一步,會調用背景接口判斷使用者是否注冊過,如果已注冊輸入密碼登入,如果未注冊就輸入密碼注冊和登入。右邊的UIViewController是共用的,兩個頁面,一個讓使用者輸入使用者名,一個則負責接收密碼。UI比較簡單,如下所示:
看完UI, 我們來看一下登入或注冊的相關網絡請求的代碼。下方的UserInfoRequest類就負責所有與使用者資訊相關的網絡請求,從下方的代碼截圖中,我們可以看到UserInfoRequest的基類是BaseRequest。下方的queryUserInfo(userName)就是上面左邊的頁面所調用的方法,用來判斷該使用者是否是注冊過的使用者。在queryUserInfo()中對Request類進行了執行個體化,并且調用了相應的請求方法。并且對相應的事件回調做了處理,具體如下所示。
在我們相應的ViewController中會調用上述的方法,下方就是使用者在輸入相應的使用者資訊後點選next所調用的方法。通過相應的閉包事件,最終将網絡請求的結果回調到了VC中。
至此我們iOS用戶端的登入就實作完畢了。 其他的代碼和上面的思路類似,在此就不做過多贅述了。
本篇部落格,就先到這兒吧,其他代碼和上述的思路一直,按照上述的思路去實作筆記的增删改查即可,在此就不多廢話了。完整Demo請移步github相關連結。
github分享連結: https://github.com/lizelu/PerfectDemo
作者:青玉伏案
出處:http://www.cnblogs.com/ludashi/
本文版權歸作者和共部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
如果文中有什麼錯誤,歡迎指出。以免更多的人被誤導。
收履歷:某網際網路公司,招聘iOS/Android靠譜工程師,入職後,可内部聯系樓主,有小禮品贈送,有意者可郵箱投遞履歷:[email protected]