iOS專案開發MVVM架構實踐(第三篇:應用佈局)

weixin_33670713發表於2018-05-12

有了前面兩篇的基礎,我們通過具體的例子來說明這個架構是怎麼佈局的,然後我們一步步的實現它們。接下來,我們一大家熟悉的使用者登入來做介紹,比如我們有這樣的一個登入介面,下圖:

2634967-8160575576895419.png
login

需求有,那就讓我們動手去實現它的整個流程:

第一步:用xcode打我們的專案,新建一個framework(File->New->Target->Cocoa Touch Framework),命名為Services,匯入NetworkAPI的framework以及其他用使用的第三方framework,首先,先定義login介面的Router,如下:

2634967-ae0d7484991f9545.png
AccountRouter.swift

接著,實現登入的service方法,新建一個AccountServices的檔案,具體如下:

2634967-e27f7b114dbb308e.png
AccountServices.swift

由於,我們需要把用登入資料本地化,這邊使用sugarrecord(具體使用檢視GitHub)來簡化coredata資料的儲存,User(Model,跟建services framework的方式一樣)的定義如下:

2634967-138e2be467428cef.png
User.swift

同時,使用了ObjectMapper把JSON轉化為Model(User),具體使用方法這邊就不做介紹,請檢視GitHub文件。

第二步,從第一步我們實現這個架構的Services層和Model層,接下來我們要實現就是為View層提供可監聽的屬性(Property)與可執行的動作(Action)的ViewModel層,跟前面類似新建一個ViewModel的framework,具體如下:

2634967-1c526a8de4a9997f.png
ViewModelBase.swift
2634967-8a3e75d880453fbe.png
LoginViewModel.swift

主要有兩個檔案,分別為ViewModelBase.Swift和LoginViewModel.swift,我們整個使用者登入邏輯到這邊基本都實現了,就差怎麼運用View層,由於,整個登入介面是用程式碼寫的,使用到UITableView, 使用者輸入的值是通過delegate傳出來的,所以這邊使用Action傳入輸入引數的方式實現,如果使用storyboard畫介面的,可以考慮屬性繫結的方式,ViewModel的就應該這麼寫了,如下:

2634967-d910b9fc2f694f1b.png
LoginViewModel.swift

繫結,其實很簡單,類似如下圖所示:

2634967-4fdd12994020a602.png
Property繫結
2634967-ff16d88b1350b74c.png
Action繫結

最後一步,也就是View層,不管是用程式碼寫的介面,還是storyboard畫的介面,上面的兩種ViewModel的實現都可以用,主要看那種使用其他比較方便,要做的事情比較就好了。我這邊運用的是第一種,是由於比較適合我運用場景,大致的程式碼如下:

2634967-0ae86feb98e7c826.png
取到name和pwd
2634967-0262b6adbc96ae21.png
執行action

到此,整個架構的佈局就完成了,大致可以歸為:Model -> Services -> ViewModel -> View,我們這邊在Model與ViewModel之間插入一個Services層,主要是為了分離呼叫API邏輯實現的部分,減少ViewModel的負擔,讓其看起來比較輕量級。

就到此了!

相關文章