Ich sende NSString
und UIImage
über Bluetooth. Ich beschloss, beide in einem NSDictionary
zu speichern und dann das Wörterbuch in NSData
zu konvertieren.
Meine Frage ist, wie man NSDictionary
in NSData
konvertiert und umgekehrt?
NSDictionary -> NSData:
NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];
NSData -> NSDictionary:
NSDictionary *myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:myData];
NSDictionary -> NSData:
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 -> NSDictionary
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];
Sie können dies mit jeder Klasse tun, die mit NSCoding kompatibel ist.
Verwenden Sie NSJSONSerialization:
NSDictionary *dict;
NSData *dataFromDict = [NSJSONSerialization dataWithJSONObject:dict
options:NSJSONWritingPrettyPrinted
error:&error];
NSDictionary *dictFromData = [NSJSONSerialization JSONObjectWithData:dataFromDict
options:NSJSONReadingAllowFragments
error:&error];
Das letzte gibt id
zurück, daher ist es eine gute Idee, den zurückgegebenen Objekttyp zu überprüfen, nachdem Sie das Casting durchgeführt haben (hier wurde das Casting auf NSDictionary durchgeführt).
In Swift 2 können Sie dies folgendermaßen tun:
var dictionary: NSDictionary = ...
/* NSDictionary to NSData */
let data = NSKeyedArchiver.archivedDataWithRootObject(dictionary)
/* NSData to NSDictionary */
let unarchivedDictionary = NSKeyedUnarchiver.unarchiveObjectWithData(data!) as! NSDictionary
In Swift:
/* NSDictionary to NSData */
let data = NSKeyedArchiver.archivedData(withRootObject: dictionary)
/* NSData to NSDictionary */
let unarchivedDictionary = NSKeyedUnarchiver.unarchiveObject(with: data)
NSDictionary von NSData
http://www.cocoanetics.com/2009/09/nsdictionary-from-nsdata/
NSDictionary zu NSData
Sie können dafür die NSPropertyListSerialization-Klasse verwenden. Schauen Sie sich die Methode an:
+ (NSData *)dataFromPropertyList:(id)plist format:(NSPropertyListFormat)format
errorDescription:(NSString **)errorString
Gibt ein NSData-Objekt zurück, das eine bestimmte Eigenschaftsliste in einem angegebenen Format enthält.
Probieren Sie mal das hier an
NSError *error;
NSDictionary *responseJson = [NSJSONSerialization JSONObjectWithData:webData
options:NSJSONReadingMutableContainers
error:&error];