iosswift實現簡單MVP模式

code_sky發表於2018-03-27

        在移動開發中,會用到各種架構,比如mvp,mvvm等,其目的就是為了讓專案程式碼的可讀性更好,減輕在view(controller)中的大量程式碼問題。接下來就開始我們的mvp入門之旅吧。

1.什麼是MVP?

    MVP是模型(Model)、檢視(View)、主持人(Presenter)的縮寫,分別代表專案中3個不同的模組。

1.1 模型 (Model):負責處理資料的載入或儲存

1.2 檢視 (View):負責介面資料的展示與使用者互動

1.3 主持人(Presenter):是Model和View之間的橋樑,將兩者進行連結。 

2.MVP的簡單實踐:

       這裡我們用app開發中常用的登入功能為例,用mvp來實現一個登入邏輯(功能)。既然用MVP 那麼我們得新建三個類即:LoginModel,LoginPresenter,LoginView,程式碼如下:

2.1 LoginModel:

// 定義一個協議用於做登入結果的回撥

protocol LoginDeletage {

    func loginResult(result:String)

}

// 定義一個閉包來實現回撥(功能和上面的協議一樣,所以可以用協議或閉包來完成回撥)

  typealias LoginBlock = (_result:String)->Void

class LoginModel:NSObject{

    //具體的登入實現邏輯(這裡為了方便所以只是模擬了登入過程,實際過程在這裡用網路請求完成登入驗證即可)

    func login(name:String,pwd:String,deletage:LoginDeletage){

        if name ==”admin”&& pwd ==”123″{

          deletage.loginResult(result:”登入成功”)

        }else{

          deletage.loginResult(result:”賬號或密碼錯誤”)

         }

    }

    // 這裡用閉包來實現回撥其實和上面的功能都一樣,只需要選擇其中一種即可

    func login(name:String,pwd:String,blok:LoginBlock){

        if name ==”admin”&& pwd ==”123″{

            blok(“登入成功”)

        }else{

            blok(“賬號或密碼錯誤”)

        }

    }

}

2.2 LoginView:

// 定義一個協議用來實現與介面互動需要的互動方法

protocol LoginView  {

    // 這裡只是使用了一個簡單的登入結果顯示方法,當然需要其它方法的時候只需要在這裡新增相應的方法即可

    func loginResult(result:String)

// …….還可以定義更多方法

}

2.3 LoginPresenter:

// 別忘了這裡要實現在LoginModel中定義的協議

class LoginPresenter:NSObject,LoginDeletage{

    // 持有LoginModel

    private var model:LoginModel?

    // 持有 LoginView

    private var loginView:LoginView?

    //在構造方法中傳入LoginView

    init(loginView:LoginView) {

        self.loginView=loginView

        self.model = LoginModel()

    }

    // 定義一個login方法供外部呼叫

    func login(name:String,pwd:String) {

        //這裡呼叫通過協議的回撥方式呼叫LoginModel中的login方法

//      self.model?.login(name: name, pwd: pwd,deletage: self)

        //這裡呼叫通過閉包的回撥方式呼叫LoginModel中的login方法

        self.model?.login(name: name, pwd: pwd, blok: {resultin

            loginView?.loginResult(result: result)

        })

    }

    // 實現協議裡的方法

    func loginResult(result:String) {

      self.loginView?.loginResult(result: result)

    }

}

3.以上三個類定義好了之後接下來開始測試,只需要在我們的viewController中呼叫即可:

//這裡需要實現LoginView的協議

class ViewController:UIViewController,LoginView{

    private var p:LoginPresenter?

    overridefuncviewDidLoad() {

        super.viewDidLoad()

        self.p=LoginPresenter(loginView:self)

        self.p?.login(name:”admin”, pwd:”1234″)

    }

    func loginResult(result:String) {

        print(“登入結果:”,result)

    }

}

4.總結:

      至此,一個簡單的MVP登入實現就出來了,是不是發現viewController中的程式碼很簡潔明瞭。MVP 的好處是不是就體現出來了,比以往的傳統模式來說viewController裡就不再有那麼多東西了吧。如果喜歡我的文章歡迎關注我哦,有什麼問題可以留言大家一起交流學習!

部落格園: 猿哥愛碼


相關文章