मेरे पास एक ऑब्जेक्ट है जहां हमने NSKeyedArchiver को क्लास Foo के रूप में संग्रहित करने के लिए उपयोग किया है

फिर मैंने लक्ष्य का नाम Apple से बदलकर Orange कर दिया। और यह उत्पादन में चला गया और उपयोगकर्ता स्टार्टअप पर दुर्घटनाग्रस्त होने लगे। लेकिन सब नहीं। और लॉग NSKeyedUnarchiver की ओर इशारा करते हैं

जब लक्ष्य को Apple कहा गया था और जब इसे Orange कहा गया था और इसे xml में परिवर्तित कर दिया गया था, तब से मैंने संग्रहीत Foo फ़ाइल को जाकर पकड़ लिया ताकि मैं इसे पढ़ सकूं। मुख्य और एकमात्र अंतर (मुझे लगता है) यह है कि classname कुंजी क्रमशः Apple.Foo और Orange.Foo है।

मैं संग्रहीत फ़ाइलों में से एक कैसे प्राप्त कर सकता हूं और इसका संग्रहीत वर्ग नाम कैसे जांच सकता हूं?

अगर मैं NSKeyedUnarchiver.unarchiveObject(withFile: path) as? Foo करता हूं तो यह क्रैश हो जाएगा।

आदर्श रूप में मुझे ऐसा कुछ चाहिए:

let object = NSKeyedUnarchiver.unarchiveObject(withFile: path) as? [String : Any] 
let name = object!["classname"]!
if name == "Apple.Foo" {
    //delete the cache and let it rebuild
}

लेकिन जाहिर है यह इस तरह काम नहीं करता है। मैं कैसे जांच सकता हूं कि मेरे पास दूषित फ़ाइल है और ऐप क्रैश किए बिना इसे हटा दिया गया है, इस पर कोई विचार?

सहायता के लिए धन्यवाद!

0
Frankie 4 जुलाई 2018, 00:00

1 उत्तर

सबसे बढ़िया उत्तर

पिछले कुछ दिनों में मैंने सीखा है कि आप एक ही समय में अनारकलीवर के लिए दो अलग-अलग वर्ग के नाम सेट कर सकते हैं और वे दोनों काम करेंगे:

NSKeyedUnarchiver.setClass(Foo.classForKeyedUnarchiver(), forClassName: "Apple.Foo")
NSKeyedUnarchiver.setClass(Foo.classForKeyedUnarchiver(), forClassName: "Orange.Foo")

अब इससे कोई फ़र्क नहीं पड़ता कि संग्रह के समय फ़ाइल का वास्तव में कौन सा वर्गनाम है।

1
Frankie 6 जुलाई 2018, 14:59