2015-10-08 5 views
5

जब जब स्विफ्ट का उपयोग कर संग्रह से निकालने की कोशिश कर रहा निम्न अपवाद हो रही है डिकोड नहीं कर सकते हैं:NSKeyedUnarchiver वर्ग की वस्तु NSKnownKeysDictionary1

न आया हुआ अपवाद 'NSInvalidUnarchiveOperationException', कारण की वजह से एप्लिकेशन समाप्त: '*** - [NSKeyedUnarchiver decodeObjectForKey:]: कुंजी (NS.objects) के लिए कक्षा (NSKnownKeysDictionary1) की वस्तु को डीकोड नहीं कर सकता; कक्षा को स्रोत कोड या एक लाइब्रेरी में परिभाषित किया जा सकता है जो '

संदर्भ नहीं है: मैं "साझा लिंक" एक्सटेंशन बना रहा हूं। मेरे मुख्य ऐप में (उद्देश्य सी में लिखा गया) मैं MMWormhole का उपयोग कर लिंक के बारे में जानकारी के साथ शब्दकोशों की एक सरणी लिखता हूं।

NSFetchRequest* bookmarkFetch = [NSFetchRequest fetchRequestWithEntityName:@"XX"]; 
    bookmarkFetch.propertiesToFetch = @[ 
             @"name", @"text", @"date", @"url" 
             ]; 
    bookmarkFetch.resultType = NSDictionaryResultType; 
    NSArray* bookmarks = [moc executeFetchRequest:bookmarkFetch error:NULL]; 

    [wormhole passMessageObject:bookmarks identifier:@"XXX"]; 

सरणी में मान एनएसएसटींग्स ​​और एनएसडीएटी हैं।

MMWormhole की आंत में आप मिल:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:messageObject]; 

messageObject किसी भी मध्यवर्ती प्रसंस्करण के बिना केवल बुकमार्क्स सरणी है।

विस्तार में मेरे पास है:

let wormhole = MMWormhole(applicationGroupIdentifier: "group.XX", optionalDirectory:nil) 
    let bookmarks = wormhole.messageWithIdentifier("XXX") as? Array<Dictionary<String,AnyObject>> 

messageWithIdentifier: यह अंततः बुला समाप्त होता है:

id messageObject = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

सरणी सही ढंग से एप्लिकेशन समूह फ़ोल्डर में बाहर लिखा है - मैं इसे का उपयोग कर पढ़ सकते हैं एक अन्य एक्सटेंशन, उद्देश्य सी

में लिखा गया यह अपवाद तब दिखाई देता है जब मैं सिम्युलेटर में चलता हूं। कोड 3212 बिट डिवाइस (आईफोन 5 और आईपैड 3) पर चलने पर सही ढंग से काम करने के लिए दिखाई देता है। वर्तमान में परीक्षण करने के लिए मेरे पास 64-बिट डिवाइस नहीं है।

मुझे लगता है कि मुझे import या एक ढांचा याद आ रही है, लेकिन कौन सा एक है?

+0

क्या पर 'डेटा' का स्वरूप है बिंदु 'NSKetedUnarchiver' कहा जाता है? क्या यह संभव है कि कोड में क्लास या क्लास स्ट्रक्चर बदल गया है क्योंकि पहले फाइल सिस्टम में सहेजा जा रहा है? व्युत्पन्न डेटा/कैश की सफाई आपको बता सकती है कि यह समस्या है या नहीं। – ColinMasters

+0

यह सिर्फ 'बुकमार्क्स' एनएसएआरएआरई को सीधे NSKeyedArchiver तक पास करता है। मैंने उस कोड के साथ अपना प्रश्न अपडेट कर लिया है। –

उत्तर

2

मैंने ऐप्पल डेवलपर रिलेशंस से ऐप्पल डेवलपर मंचों और (एक बार) got a good answer पर यह पूछा। मैं महत्वपूर्ण बिट्स उद्धृत करूंगा:

NSKnownKeysDictionary1 कोर डेटा वूडू है जिसे मैं समझ नहीं पा रहा हूं। ... स्पष्ट रूप से इसके क्रमबद्धता और deserialisation के साथ कुछ गलत हो रहा है। क्या आपके पास कोर डेटा है और वर्महोल के दोनों सिरों पर चल रहा है? भले ही, यह आपके बुकमार्क्स सरणी (और कोर डेटा से वापस लौटने वाली किसी और चीज) की एक गहरी प्रति करने के लिए अधिक समझदारी कर सकता है ताकि आप कोर डेटा सामग्री के बजाय 'तार' पर मानक शब्दकोश भेज रहे हों।

तो मेरा समाधान विस्तार में कोर डेटा ढांचे को जोड़ने या गहरी प्रतिलिपि करने के लिए है। (मैं अस्थायी रूप से पूर्व किया है उचित समाधान शायद उत्तरार्द्ध है।।)

+0

बस अपने एक्सटेंशन में कोर डेटा फ्रेमवर्क जोड़ें :)। –

4

यह सिर्फ एक पक्ष टिप्पणी है:

आप दोनों NSKeyedArchiver & NSKeyedUnarchiver के लिए वर्ग के नाम निर्धारित कर सकते हैं। मुझे कोरडाटा से निपटने के बिना यह समस्या थी। अनारक को अब अपनी खुद की कक्षा नहीं मिली।

सेटिंग मेरी कक्षा के लिए className जिन्हें आप नीचे काम करता है:

archiver के लिए:

NSKeyedArchiver.setClassName("MyClass", for: MyClass.self) 
let data = NSKeyedArchiver.archivedData(withRootObject: root) 

और unarchiver:

NSKeyedUnarchiver.setClass(MyClass.self, forClassName: "MyClass") 
let root = NSKeyedUnarchiver.unarchiveObject(with: data) 
संबंधित मुद्दे