2016-12-19 7 views
8

तो मैं इस ट्यूटोरियल के माध्यम से जा रहा हूं, और आखिरकार मैंने यह पता लगाया है कि एनएससीओडी का उपयोग करके किसी ऑब्जेक्ट को कैसे संग्रहीत किया जाए, और इसे फाइल सिस्टम से फिर से शुरू करने के लिए प्रारंभिक प्रारंभकर्ता के साथ शुरू किया जाए।एनएससीओडी-अनुपालन होने का क्या अर्थ है?

// To encode the object in the first place 

func encode(with aCoder: NSCoder) { 
     aCoder.encode(name, forKey: "name") 
} 

// To 're-initialize' the object 

required init?(coder aDecoder: NSCoder) { 
    self.name = aDecoder.decodeObject(forKey: "name") as! String 
    super.init() 
} 

हालांकि, मैं अभी भी इस बारे में थोड़ा अनिश्चित हूं कि यह पूरी प्रक्रिया उच्च स्तर पर कैसे काम करती है। कृपया मुझे बताएं कि मेरी सोच गलत है।

1) अपने वस्तु NSCoding प्रोटोकॉल को गोद ले, तो आप, आदेश में एक NSCoder वस्तु समारोह के माध्यम से पारित किया है और एक 'एनकोड' विधि को करने के लिए एनकोड (:) समारोह के साथ उपयोग कर सकते हैं अपने ऑब्जेक्ट के उदाहरण संपत्ति गुजर (जो एक ऑब्जेक्ट स्वयं है) पहले तर्क के रूप में, और एक स्ट्रिंग दूसरे मान के रूप में एक कुंजी का प्रतिनिधित्व करता है।

2) यह एक पुनरावर्ती प्रक्रिया है, इसलिए अनिवार्य रूप से, आप अपने ऑब्जेक्ट की आवृत्ति संपत्ति (यानी नाम) को पारित करने का कारण यह है कि वह संपत्ति (जो वस्तु है) को एन्कोड संदेश भेजा जा सकता है, और इसी तरह और जब तक यह अब एनएससीओडीडी गोद लेने तक नहीं पहुंच जाता तब तक लाइन को आगे बढ़ाएं।

3) एडीकोडर ऑब्जेक्ट चीजों को भी डीकोड कर सकता है, इसलिए अपनी कस्टम ऑब्जेक्ट की शुरुआत के बाद, आप जो भी ऑब्जेक्ट इस्तेमाल करते हैं, उसके लिए जो ऑब्जेक्ट सेट किया गया था, उसे डीकोड करने के लिए आप फॉबल प्रारंभकर्ता का उपयोग करना चाहेंगे।

यहाँ मैं वास्तव में समझ में नहीं आता क्या ...

कैसे aDecoder वस्तु जो व्यक्ति वस्तु कुंजियों का सेट के लिए उपयोग करने के लिए पता है क्या है? उदाहरण के लिए, मान लें कि मेरे पास 10 कुत्ते ऑब्जेक्ट उदाहरण हैं। जब सिस्टम एक डीकोडर से गुज़रता है, और मैं उस पर decodeObject विधि का उपयोग करता हूं, और यह कुंजी द्वारा उस डीकोडेड ऑब्जेक्ट के मूल्य पर self.name सेट करता है, तो एक डिकोडर कैसे जानता है कि इस कुत्ते का नाम "जैक" के रूप में सहेजा गया था, और नहीं "जोड़ी" जैसे दुर्घटना से दूसरे कुत्ते के उदाहरणों में से एक को पकड़ो?

दूसरे शब्दों में, एक बार जब आप किसी ऑब्जेक्ट की गुणों को एन्कोड करते हैं, तो फाइल सिस्टम ऑब्जेक्ट इंस्टेंस को रखने के लिए कैसे जानता है ए गुणों को ऑब्जेक्ट इंस्टेंस बी से अलग करता है, इस प्रकार ऐसा करने में, जब ऐप को बूट किया जाता है और ऑब्जेक्ट प्राप्त होता है शुरू किया, यह केवल वस्तु ए गुणों को पकड़ता है?

धन्यवाद

उत्तर

1

मुझे लगता है कि टुकड़ा से वंचित हो रहे (मुझे ठीक कर लें मैं गलत हूँ) कि NSCoding एक डेटाबेस नहीं है। यह एक प्रोटोकॉल है जो किसी ऑब्जेक्ट को क्रमबद्ध करने के तरीके को परिभाषित करता है।

डीकोडिंग के लिए उपयोग किया गया एनएससीओडर जो वस्तु को जानता है क्योंकि वह वह है जो इसे एन्कोड किया गया था। उदाहरण के लिए, यदि आपने अपने कुत्ते को "/tmp/jack.dog" नामक डिस्क पर फ़ाइल में सहेजने के लिए एनएसकेडएड आर्किवर (एनएससीओडर सबक्लास, और एनएससीओडी का उपयोग करने का एक आम तरीका) का उपयोग किया है, तो आप बाद में "एनटीकेड यूनार्चिवर" को लोड करने के लिए " /tmp/jack.dog ", और इसे वापस कुत्ते के उदाहरण में deserialize। यह "कौन सा ऑब्जेक्ट जानता है" क्योंकि वह (केवल) वह है जो उस फ़ाइल में सहेजा गया था।

यह एक फ़ाइल नहीं है। डेटा anywhere at all बचाया जा सकता है।

+0

उसमें, मैं जोड़ता हूं कि ऑब्जेक्ट ग्राफ़ श्रेणीबद्ध रूप से एक रूट ऑब्जेक्ट से अवरुद्ध हो जाता है। यदि उस ऑब्जेक्ट ग्राफ़ में लूप होते हैं, तो यह केवल एक बार लिखा जाता है, और बाद के स्पॉट जहां उस ऑब्जेक्ट का संदर्भ दिया जाता है, इसके बजाय ऑब्जेक्ट की पहली प्रतिलिपि के पीछे संदर्भ होते हैं। – dgatwood

1

तो, आप वास्तव में class func archivedData(withRootObject rootObject: Any) -> Data' पर कॉल करके एक कुंजी संग्रहकर्ता का उपयोग कर सकते हैं, इसे कुछ ऑब्जेक्ट पास कर सकते हैं और Data का उदाहरण वापस प्राप्त कर सकते हैं, जिससे आप डिस्क पर बने रह सकते हैं।

वह डेटा क्या है? यह rootObject में पारित वस्तु का एक प्रतिनिधित्व है, जिसमें ऑब्जेक्ट क्लास का नाम और कुंजी और संबंधित मानों का एक सेट शामिल है (जहां उन संबंधित मान समान रूप से एन्कोड किए गए हैं)। तो यह संबंधित ऑब्जेक्ट डेटा के साथ ऑब्जेक्ट ग्राफ़ का पदानुक्रमिक प्रतिनिधित्व है।

कहें कि ऑब्जेक्ट आपका Dog उदाहरण था, यह कक्षा और सभी संबंधित कुत्ते विशेषताओं को जानता है।

इसके बजाय कहें कि ऑब्जेक्ट 10 Dog उदाहरणों की एक सरणी थी, अब सरणी अपने इंडेक्स के खिलाफ एन्कोडेड ऑब्जेक्ट्स का एक सेट स्टोर करेगी, प्रत्येक एन्कोडेड ऑब्जेक्ट को इसके वर्ग और संबंधित कुत्ते विशेषताओं को जानना होगा, और एन्कोडर स्टोर्स जो रूट ऑब्जेक्ट एक सरणी है

तो, यह अतिरिक्त डेटा है जो एन्कोडर द्वारा प्रबंधित किया जाता है (और डिकोडर द्वारा उपयोग किया जाता है) जो यह जानने की अनुमति देता है कि जब आप इसे कुछ डेटा पास करते हैं (उदाहरण के लिए फ़ाइल से) और इसे होने के लिए कहें डीकोड।

संबंधित मुद्दे