यह सवाल हर समय सामने आता है।
एक सुझाव एक डेटा कंटेनर सिंगलटन बनाने का है: एक वस्तु जो आपके एप्लिकेशन के जीवन में एक बार और केवल एक बार बनाई जाती है, और आपके ऐप के जीवन के लिए बनी रहती है।
यह दृष्टिकोण एक स्थिति के लिए अच्छी तरह से अनुकूल है जब आपके पास वैश्विक ऐप डेटा होता है जिसे आपके ऐप में विभिन्न वर्गों में उपलब्ध / संशोधित करने की आवश्यकता होती है।
व्यू कंट्रोलर्स के बीच वन-वे या 2-वे लिंक स्थापित करने जैसे अन्य दृष्टिकोण उन परिस्थितियों के लिए बेहतर हैं, जहां आप व्यू कंट्रोलर्स के बीच सीधे सूचना / संदेश भेज रहे हैं।
(अन्य विकल्पों के लिए नीचे nhgrif का उत्तर देखें।)
डेटा कंटेनर सिंगलटन के साथ, आप अपनी क्लास में एक प्रॉपर्टी जोड़ते हैं जो आपके सिंगलटन के लिए एक संदर्भ स्टोर करती है, और फिर उस प्रॉपर्टी को कभी भी उपयोग करने की आवश्यकता होती है।
आप अपना सिंगलटन सेट कर सकते हैं ताकि यह डिस्क पर सामग्री को सहेजे ताकि आपकी ऐप स्थिति लॉन्च के बीच बनी रहे।
मैंने GitHub पर एक डेमो प्रोजेक्ट बनाया, जिसमें दिखाया गया है कि आप यह कैसे कर सकते हैं। लिंक यहां दिया गया है:
GitHub पर SwiftDataContainerSingleton परियोजना
यहां उस परियोजना से README है:
SwiftDataContainerSingleton
एप्लिकेशन स्टेट को बचाने और ऑब्जेक्ट्स के बीच साझा करने के लिए डेटा कंटेनर सिंगलटन का उपयोग करने का प्रदर्शन।
DataContainerSingleton
वर्ग वास्तविक सिंगलटन है।
यह sharedDataContainer
सिंगलटन के संदर्भ को बचाने के लिए एक स्थिर स्थिरांक का उपयोग करता है ।
सिंगलटन तक पहुंचने के लिए, सिंटैक्स का उपयोग करें
DataContainerSingleton.sharedDataContainer
नमूना परियोजना डेटा कंटेनर में 3 गुणों को परिभाषित करती है:
var someString: String?
var someOtherString: String?
var someInt: Int?
someInt
डेटा कंटेनर से संपत्ति लोड करने के लिए , आप इस तरह कोड का उपयोग करेंगे:
let theInt = DataContainerSingleton.sharedDataContainer.someInt
कुछ मान को सहेजने के लिए, आप सिंटैक्स का उपयोग करेंगे:
DataContainerSingleton.sharedDataContainer.someInt = 3
DataContainerSingleton की init
विधि के लिए एक पर्यवेक्षक जोड़ता है UIApplicationDidEnterBackgroundNotification
। यह कोड इस तरह दिखता है:
goToBackgroundObserver = NSNotificationCenter.defaultCenter().addObserverForName(
UIApplicationDidEnterBackgroundNotification,
object: nil,
queue: nil)
{
(note: NSNotification!) -> Void in
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject( self.someString, forKey: DefaultsKeys.someString)
defaults.setObject( self.someOtherString, forKey: DefaultsKeys.someOtherString)
defaults.setObject( self.someInt, forKey: DefaultsKeys.someInt)
defaults.synchronize()
}
प्रेक्षक कोड में यह डेटा कंटेनर के गुणों को बचाता है NSUserDefaults
। आप NSCoding
राज्य डेटा को बचाने के लिए कोर डेटा, या अन्य विभिन्न तरीकों का भी उपयोग कर सकते हैं ।
DataContainerSingleton की init
विधि इसके गुणों के लिए सहेजे गए मानों को लोड करने का भी प्रयास करती है।
Init विधि का वह भाग इस तरह दिखता है:
let defaults = NSUserDefaults.standardUserDefaults()
someString = defaults.objectForKey(DefaultsKeys.someString) as! String?
someOtherString = defaults.objectForKey(DefaultsKeys.someOtherString) as! String?
someInt = defaults.objectForKey(DefaultsKeys.someInt) as! Int?
NSUserDefaults में मानों को लोड करने और सहेजने की कुंजी को स्ट्रिंग स्थिरांक के रूप में संग्रहीत किया जाता है DefaultsKeys
, जो एक संरचना का हिस्सा है , जिसे इस प्रकार परिभाषित किया गया है:
struct DefaultsKeys
{
static let someString = "someString"
static let someOtherString = "someOtherString"
static let someInt = "someInt"
}
आप इस तरह के एक स्थिरांक का संदर्भ देते हैं:
DefaultsKeys.someInt
डेटा कंटेनर सिंगलटन का उपयोग करना:
यह नमूना अनुप्रयोग डेटा कंटेनर सिंगलटन का सही उपयोग करता है।
दो दृश्य नियंत्रक हैं। पहला UIViewController का एक कस्टम उपवर्ग है ViewController
, और दूसरा UIViewController का एक कस्टम उपवर्ग है SecondVC
।
दोनों दृश्य नियंत्रकों का उन पर एक पाठ क्षेत्र है, और दोनों डेटा कंटेनर सिंगलटन की someInt
संपत्ति से अपनी viewWillAppear
विधि में पाठ क्षेत्र में एक मूल्य लोड करते हैं , और दोनों पाठ फ़ील्ड से वर्तमान मान को डेटा कंटेनर के `someInt 'में वापस सहेजते हैं।
पाठ फ़ील्ड में मान को लोड करने का कोड viewWillAppear:
विधि में है:
override func viewWillAppear(animated: Bool)
{
let value = DataContainerSingleton.sharedDataContainer.someInt ?? 0
textField.text = "\(value)"
}
डेटा-कंटेनर में उपयोगकर्ता-संपादित मान को सहेजने का कोड दृश्य नियंत्रकों के textFieldShouldEndEditing
तरीकों में है:
func textFieldShouldEndEditing(textField: UITextField) -> Bool
{
DataContainerSingleton.sharedDataContainer.someInt = textField.text!.toInt()
return true
}
आपको viewDillLoad के बजाय viewWillAppear में अपने उपयोगकर्ता इंटरफ़ेस में मान लोड करना चाहिए ताकि आपके UI को हर बार व्यू कंट्रोलर प्रदर्शित हो।