मैं NSData और इसके विपरीत NS ढाल को कैसे परिवर्तित कर सकता हूं?


158

मैं ब्लूटूथ भेज रहा हूं NSStringऔर UIImageउपयोग कर रहा हूं । मैंने दोनों को एक में संग्रहीत करने का फैसला किया NSDictionaryऔर फिर शब्दकोश को रूपांतरित किया NSData

मेरा सवाल यह है कि कैसे और वीज़ा में कनवर्ट किया NSDictionaryजाए NSData?

जवाबों:


361

एनएसडॉरैट -> एनएसडाटा:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDictionary:

NSDictionary *myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:myData];

NSData -> NSDictionary के लिए, NS सहकर्मी के लिए कलाकारों को अनावश्यक लगता है।
पैंग

51

एनएसडॉरैट -> एनएसडाटा:

NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:yourDictionary forKey:@"Some Key Value"];
[archiver finishEncoding];
[archiver release];

// Here, data holds the serialized version of your dictionary
// do what you need to do with it before you:
[data release];

NSData -> NS सहकर्मी

NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
NSDictionary *myDictionary = [[unarchiver decodeObjectForKey:@"Some Key Value"] retain];
[unarchiver finishDecoding];
[unarchiver release];
[data release];

आप एनएससी कोडिंग के अनुरूप किसी भी वर्ग के साथ कर सकते हैं।

स्रोत


1
इस उत्तर से कुछ भी दूर नहीं करने के लिए, लेकिन सिर्फ एक सिर है कि यह एआरसी के अनुरूप नहीं है
Madbreaks

10
हां, मेरा जवाब 2011 से है जहां एआरसी मौजूद नहीं था
लियोनस

41

NSJSONSerialization का उपयोग करें:

NSDictionary *dict;
NSData *dataFromDict = [NSJSONSerialization dataWithJSONObject:dict
                                                       options:NSJSONWritingPrettyPrinted
                                                         error:&error];

NSDictionary *dictFromData = [NSJSONSerialization JSONObjectWithData:dataFromDict
                                                             options:NSJSONReadingAllowFragments
                                                               error:&error];

नवीनतम रिटर्न id, इसलिए इसका एक अच्छा विचार है कि आपके द्वारा डाले जाने के बाद लौटी हुई वस्तु के प्रकार की जांच करें (यहां मैंने एनएसडॉर पर डाली)।


23

में स्विफ्ट 2 आप इस तरह से यह कर सकते हैं:

var dictionary: NSDictionary = ...

/* NSDictionary to NSData */
let data = NSKeyedArchiver.archivedDataWithRootObject(dictionary)

/* NSData to NSDictionary */
let unarchivedDictionary = NSKeyedUnarchiver.unarchiveObjectWithData(data!) as! NSDictionary

में स्विफ्ट 3 :

/* NSDictionary to NSData */
let data = NSKeyedArchiver.archivedData(withRootObject: dictionary)

/* NSData to NSDictionary */
let unarchivedDictionary = NSKeyedUnarchiver.unarchiveObject(with: data)

काम नहीं किया ! स्विफ्ट 3 समकक्ष कोड काम नहीं किया। डेटा जाने = NSKeyedArchiver.archivedData (withRootObject: dataFromNetwork) [_SwiftValue encodeWithCoder:]: गैर मान्यता प्राप्त चयनकर्ता उदाहरण के लिए भेजा ...
mythicalcoder

अपनी त्वरित प्रतिक्रिया की सराहना करें। मेरा मतलब है कि यह है - स्विफ्ट 3 कोड भी काम नहीं किया। मेरा डेटा 3lvis / नेटवर्किंग HTTP लाइब्रेरी से है, यह Any?टाइप का है। लेकिन इसमें से त्रुटि परिवर्तित होती दिखाई NSDictionaryदी NSData। इसलिए मैंने आपके कोड की कोशिश की। काम नहीं किया।
पौराणिक

17

NSData से NS सहोदर

http://www.cocoanetics.com/2009/09/nsdictionary-from-nsdata/

NSData को एनएसडीआर

आप उसके लिए NSPropertyListSerialization वर्ग का उपयोग कर सकते हैं। इसकी विधि पर एक नजर:

+ (NSData *)dataFromPropertyList:(id)plist format:(NSPropertyListFormat)format
                              errorDescription:(NSString **)errorString

एक निर्दिष्ट प्रारूप में दी गई संपत्ति सूची में एक NSData वस्तु देता है।


यह अधिकांश मैक ओएस डेवलपर्स के लिए एक बहुत ही सुंदर समाधान है।
mjl007

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.