有了前面兩篇的基礎(chǔ),我們通過具體的例子來說明這個(gè)架構(gòu)是怎么布局的,然后我們一步步的實(shí)現(xiàn)它們。接下來,我們一大家熟悉的用戶登錄來做介紹,比如我們有這樣的一個(gè)登錄界面,下圖:

需求有,那就讓我們動(dòng)手去實(shí)現(xiàn)它的整個(gè)流程:
第一步:用xcode打我們的項(xiàng)目,新建一個(gè)framework(File->New->Target->Cocoa Touch Framework),命名為Services,導(dǎo)入NetworkAPI的framework以及其他用使用的第三方framework,首先,先定義login接口的Router,如下:

接著,實(shí)現(xiàn)登錄的service方法,新建一個(gè)AccountServices的文件,具體如下:

由于,我們需要把用登錄數(shù)據(jù)本地化,這邊使用sugarrecord(具體使用查看GitHub)來簡化coredata數(shù)據(jù)的存儲,User(Model,跟建services framework的方式一樣)的定義如下:

同時(shí),使用了ObjectMapper把JSON轉(zhuǎn)化為Model(User),具體使用方法這邊就不做介紹,請查看GitHub文檔。
第二步,從第一步我們實(shí)現(xiàn)這個(gè)架構(gòu)的Services層和Model層,接下來我們要實(shí)現(xiàn)就是為View層提供可監(jiān)聽的屬性(Property)與可執(zhí)行的動(dòng)作(Action)的ViewModel層,跟前面類似新建一個(gè)ViewModel的framework,具體如下:


主要有兩個(gè)文件,分別為ViewModelBase.Swift和LoginViewModel.swift,我們整個(gè)用戶登錄邏輯到這邊基本都實(shí)現(xiàn)了,就差怎么運(yùn)用View層,由于,整個(gè)登錄界面是用代碼寫的,使用到UITableView, 用戶輸入的值是通過delegate傳出來的,所以這邊使用Action傳入輸入?yún)?shù)的方式實(shí)現(xiàn),如果使用storyboard畫界面的,可以考慮屬性綁定的方式,ViewModel的就應(yīng)該這么寫了,如下:

綁定,其實(shí)很簡單,類似如下圖所示:


最后一步,也就是View層,不管是用代碼寫的界面,還是storyboard畫的界面,上面的兩種ViewModel的實(shí)現(xiàn)都可以用,主要看那種使用其他比較方便,要做的事情比較就好了。我這邊運(yùn)用的是第一種,是由于比較適合我運(yùn)用場景,大致的代碼如下:


到此,整個(gè)架構(gòu)的布局就完成了,大致可以歸為:Model -> Services -> ViewModel -> View,我們這邊在Model與ViewModel之間插入一個(gè)Services層,主要是為了分離調(diào)用API邏輯實(shí)現(xiàn)的部分,減少ViewModel的負(fù)擔(dān),讓其看起來比較輕量級。
就到此了!