मैं एक आईओएस डेवलपर हूं और मैं अपनी परियोजनाओं में भारी दृश्य नियंत्रक होने का दोषी हूं इसलिए मैं अपनी परियोजनाओं को ढांचा बनाने के लिए एक बेहतर तरीका खोज रहा हूं और एमवीवीएम (मॉडल-व्यू) -ViewModel) वास्तुकला। मैं आईओएस के साथ बहुत सारे एमवीवीएम पढ़ रहा हूं और मेरे पास कुछ प्रश्न हैं। मैं एक उदाहरण के साथ अपने मुद्दों की व्याख्या करेंगे।आईओएस में एमवीवीएम का उपयोग
मेरे पास एक दृश्य नियंत्रक है जिसे LoginViewController
कहा जाता है।
LoginViewController.swift
import UIKit
class LoginViewController: UIViewController {
@IBOutlet private var usernameTextField: UITextField!
@IBOutlet private var passwordTextField: UITextField!
private let loginViewModel = LoginViewModel()
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func loginButtonPressed(sender: UIButton) {
loginViewModel.login()
}
}
यह एक मॉडल वर्ग नहीं है। लेकिन मैंने सत्यापन तर्क और नेटवर्क कॉल रखने के लिए LoginViewModel
नामक एक दृश्य मॉडल बनाया था।
LoginViewModel.swift
import Foundation
class LoginViewModel {
var username: String?
var password: String?
init(username: String? = nil, password: String? = nil) {
self.username = username
self.password = password
}
func validate() {
if username == nil || password == nil {
// Show the user an alert with the error
}
}
func login() {
// Call the login() method in ApiHandler
let api = ApiHandler()
api.login(username!, password: password!, success: { (data) -> Void in
// Go to the next view controller
}) { (error) -> Void in
// Show the user an alert with the error
}
}
}
मेरा पहला सवाल बस है मेरी MVVM कार्यान्वयन सही है? मुझे यह संदेह है क्योंकि उदाहरण के लिए मैंने नियंत्रक में लॉगिन बटन की टैप इवेंट (
loginButtonPressed
) डाला है। मैंने लॉगिन स्क्रीन के लिए एक अलग दृश्य नहीं बनाया क्योंकि इसमें केवल कुछ टेक्स्टफील्ड और एक बटन है। क्या नियंत्रक के लिए यूआई तत्वों से जुड़ी घटना विधियों के लिए स्वीकार्य है?मेरा अगला प्रश्न लॉगिन बटन के बारे में भी है। जब उपयोगकर्ता बटन को टैप करता है, तो उपयोगकर्ता नाम और पासवर्ड मानों को सत्यापन के लिए LoginViewModel में गुजरना चाहिए और यदि सफल हो, तो API कॉल पर। मेरा सवाल दृश्य मॉडल को मानों को कैसे पास करना है। क्या मुझे
login()
विधि में दो पैरामीटर जोड़ना चाहिए और जब मैं इसे व्यू कंट्रोलर से कॉल करता हूं तो उन्हें पास कर सकता हूं? या क्या मुझे उनके लिए दृश्य मॉडल में गुण घोषित करना चाहिए और दृश्य मानकों से अपने मूल्य निर्धारित करना चाहिए? एमवीवीएम में कौन सा स्वीकार्य है?व्यू मॉडल में
validate()
विधि लें। यदि उनमें से कोई खाली है तो उपयोगकर्ता को अधिसूचित किया जाना चाहिए। इसका मतलब है जांच के बाद, आवश्यक कार्रवाई करने के लिए परिणाम को देखने के लिए परिणाम नियंत्रक को वापस किया जाना चाहिए (एक चेतावनी दिखाएं)।login()
विधि के साथ वही बात। अगर अनुरोध विफल हो जाता है या अगले दृश्य नियंत्रक पर जाता है तो उपयोगकर्ता को चेतावनी दें। मैं दृश्य मॉडल से इन घटनाओं के नियंत्रक को कैसे सूचित करूं? क्या इस तरह के मामलों में केवीओ जैसे बाध्यकारी तंत्र का उपयोग करना संभव है?आईओएस के लिए एमवीवीएम का उपयोग करते समय अन्य बाध्यकारी तंत्र क्या हैं? केवीओ एक है। लेकिन मैंने पढ़ा है कि यह बड़ी परियोजनाओं के लिए काफी उपयुक्त नहीं है क्योंकि इसे बहुत सारे बॉयलरप्लेट कोड की आवश्यकता होती है (पर्यवेक्षकों को पंजीकृत/अनधिकृत करना आदि)। अन्य विकल्प क्या हैं? मुझे पता है कि रेक्टिव कोकोआ इसके लिए एक ढांचा है, लेकिन मैं यह देखने के लिए देख रहा हूं कि कोई अन्य मूल है या नहीं।
सभी सामग्री मैं पर इंटरनेट इन भागों मैं स्पष्ट करने के लिए देख रहा हूँ पर कोई जानकारी नहीं करने के लिए थोड़ा प्रदान की MVVM पर भर में आया था, इसलिए मैं वास्तव में अपनी प्रतिक्रियाओं की सराहना करेंगे।
क्या यह केवल मुझे या किसी और को दृश्य मॉडल से बनाए गए नेटवर्क अनुरोध पसंद नहीं हैं? – SoftDesigner
@ सॉफ़्टडिज़ाइनर मैं मानता हूं, दृश्य मॉडल में नेटवर्क कॉल न करने का सबसे अच्छा अभ्यास है, लेकिन उदाहरण में, एपीएचंडलर क्लास ने लॉगिन को कैसे किया जा रहा है इस बारे में विशिष्टताओं को सफलतापूर्वक समझाया है। इस बिंदु पर यह एक सबसे अच्छा अनुमान है कि वास्तव में एक नेटवर्क कॉल हो रहा है। ऐप ऑफ़लाइन हो सकता है और स्थानीय डीबी के माध्यम से लॉग इन कर सकता है। हम नहीं जानते और न ही दृश्य मॉडल (जो यह होना चाहिए)। यह बेहतर होगा अगर एपीआई चर के लिए डेटा प्रकार एक प्रोटोकॉल था जिसे एपीएचंडलर द्वारा कार्यान्वित किया गया था। –