2017-06-18 18 views
6

私は開発中であり、最近MVVMデザインパターンを練習しています。 ViewModel &コントローラ間で通信するには、私はClosureを使用しています。私はデリゲートも使うことができることを知っています。しかし、コミュニケーションのために私が従わなければならないどのような慣例や理由がありますか?私はちょっと混乱している。どんな助けもありがとう。ViewModelとコントローラ間の通信に最適な方法

+0

この場合、通信は変数交換を意味しますか? –

+0

はい。 ViewModelクラスでDataArrayを準備していて、それがコントローラに送られて、私のTableViewに供給されます。 – MarkMe

答えて

7

私もこの答えを探していたと私はこれを発見した、

がにUIレイヤ(UIL)からクロージャを渡しますBusiness Logic Layer(BLL)は、分離の懸念(SOC)を破ります。あなたが準備しているデータはBLLにありますので、基本的に "BLLは私のためにこのUILロジックを実行します"と言っています。それはSOCです。 (詳しくはhttps://en.wikipedia.org/wiki/Separation_of_concernsを参照してください。)

BLLは、代理人通知を介してUILと通信する必要があります。そういう意味で、BLLは本質的に言っています。「ちょっとUIL、私のロジックの実行が終了しました。必要なときにUIコントロールを操作するために使用できるいくつかのデータ引数があります。

だから、UILは決して彼にUI制御ロジックを実行するようBLLに求めてはいけません。 BLLに彼に通知するように頼んでください。

ここではリンクですが、より明確な視点が得られます。

Usage of MVVM in iOS

+0

あなたの時間とリンクに感謝します。 – MarkMe

0

あなたのアプリの構造によって、たくさんのオプションがあります。 1つはシングルトンを使用しています。私はあまりにも複雑なアプリではなく、この方法を好んでいます。シングルトンクラスにあるデータ処理(格納、構造化)。このシングルトンクラスからデータにアクセスするさまざまなビュー。たとえば、DataManagerという名前のシングルトンやそのようなものがあります。このシングルトンから必要なデータにアクセスするさまざまなコントローラやその他の単純な構造。ここで

は、例えば、非常に単純な遊び場コードです:

class DataManager 
{ 
    static let sharedInstance = DataManager() 

    var _value: Int = 0 
    var value: Int 
    { 
     get 
     { 
      return _value 
     } 
     set 
     { 
      _value = newValue 
     } 
    } 
} 

class DemoController1 
{ 
    let dm = DataManager.sharedInstance 

    func incValue() 
    { 
     dm.value += 1 
    } 
} 

class DemoController2 
{ 
    let dm = DataManager.sharedInstance 

    func mulValue() 
    { 
     dm.value *= 2 
    } 
} 

let dm = DataManager.sharedInstance 
let dc1 = DemoController1() 
let dc2 = DemoController2() 

print ("value: \(dm.value)") 
dc1.incValue() 
print ("value: \(dm.value)") 
dc1.incValue() 
print ("value: \(dm.value)") 
dc2.mulValue() 
print ("value: \(dm.value)") 
関連する問題