2017-06-17 6 views
1

ディアーズ、私はBoxingを使用してMVVMアーキテクチャパターンを実装しようとしていますスウィフトMVVM

class Dynamic<T> { 
typealias Listener = (T) -> Void 
var listener: Listener? 

func bind(listener: Listener?) { 
    self.listener = listener 
} 

func bindAndFire(listener: Listener?) { 
    self.listener = listener 
    listener?(value) 
} 

var value: T { 
    didSet { 
     listener?(value) 
    } 
} 

init(_ v: T) { 
    value = v 
}} 

そして、これは私のビューコントローラ、私はViewModelにを参照したのViewControllerである:私は単にボクシングクラスの追加によってそれを行っている

class SignUpViewController: UIViewController { 

// UI Outlets 
@IBOutlet weak var emailLoginTextField: FloatLabelTextField! 
@IBOutlet weak var passwordLoginTextField: FloatLabelTextField! 

var viewModel = AuthenticationViewModel() 


override func viewDidLoad() { 
    super.viewDidLoad() 

    viewModel.user.email.bind{ 

     self.emailLoginTextField.text = $0 

    } 

}} 

そして、これは私のビューモデルである:

class AuthenticationViewModel{ 

let defaults = UserDefaults.standard 

let serviceManager = ServiceManager() 

var user = User() 
func signupUser(email : String?, password: String?){ 


    let parameters : [String:String] = ["email":emailField, "password": password!, "system": "ios"] 

    serviceManager.initWithPOSTConnection(server: Utitlites.getServerName(), parameters: parameters, methodName: "/api/user/register", completion: { (responseData , errorMessage) -> Void in 

     let json = (responseData as AnyObject) as! JSON 

     print(json) 

     if ErrorHandling.handleErrorMessage(responseData: responseData).0 == true { 

      self.defaults.set("userId", forKey: json["user"]["id"].stringValue) 

      //self.userId.value = json["user"]["id"].stringValue 

      self.user = User(json: json) 




     } 

    }) 

}} 

そして、これは私のモデルである:

class User{ 

var id = Dynamic("") 
var name = Dynamic("") 
var email = Dynamic("") 

init(){ 

} 

init(json: JSON){ 

    id.value = json["user"]["id"].stringValue 
    email.value = json["user"]["email"].stringValue 

}} 

私の質問は次のとおりです。

MVVMアーキテクチャ賢明な、それは右のViewControllerにこの行使用してモデルにアクセスすることです:私は今見ることができるので

viewModel.user.email.bind{ 

    self.emailLoginTextField.text = $0 

} 

を見るには、私が考えるモデルにアクセスしていることMVVMが何を表しているのではない。私は誰かが

答えて

0

実際にプライベートであることをModelを設定している31:18でこの(IMO)と、このraywanderlich videoに応じて行くことがベストプラクティスを明確にする必要があり、あなたのVCがすべてでそれについて知っている必要はありません、 ViewModelのみです。その後

このようなViewModelModelため、セットゲッター:

var id: Dynamic<String> = Dynamic("") 
var name: Dynamic<String> = Dynamic("") 
var email: Dynamic<String> = Dynamic("") 

そして、また、あなたのViewModelで、ViewModelのデータを更新するdidSet通知を持っているユーザーオブジェクトを設定するにはしたがって:今

private var user = User() { 
    didSet { 
     id = user.id 
     name = user.name 
     email = user.email 
    } 
} 

、あなたの代わりに直接ModelでのみViewModelからこれらのプロパティにアクセスすることができます。

viewModel.email.bind{ 
    self.emailLoginTextField.text = $0 
} 

ああ、普通の文字列であることをModelのプロパティを設定することを忘れないでください。)