NSDictionary aus NSData
Im Rahmen meiner Umstellarbeiten an unserer iPhone-Software habe ich von einem eigenen XML-Format umgestellt auf Property Lists. Alle meine Datenstrukturen sind im Wurzelknoten ein NSDictionary
, damit einige Meta-Informationen (Ergebnis-Status, ggfls. Fehlernummer und -beschreibung, …) übermittelt werden können. iPhoneOS stellt für die Deserialisierung eines NSDictionary
die beiden Routinen initWithContentsOfFile:
und initWithContentsOfURL:
bereit.
Da ich jedoch mit asynchronen Requests arbeiten muss, damit die Benutzeroberfläche nicht einfriert, liegt mir die Plist in einem NSData
vor. Leider gibt es keine Methode, um ein NSDictionary
aus NSData
zu deserialisieren. Das allerdings ist schnell nachgerüstet und dank Kategorien sogar elegant:
@interface NSDictionary (MWBDictionary)
- (id)dictionaryWithData:(NSData *)data;
- (id)initWithData:(NSData *)data;
@end
@implementation NSDictionary (MWBDictionary)
- (id)dictionaryWithData:(NSData *)data { return [[[NSDictionary alloc] initWithData:data] autorelease]; }
-
(id)initWithData:(NSData *)data { NSString *tmp = nil;
self = (NSDictionary *)[NSPropertyListSerialization propertyListFromData:data mutabilityOption:NSPropertyListImmutable format:NULL errorDescription:&tmp];
NSAssert1(tmp == nil,@"Fehler in plist: %@",tmp);
return [self retain]; }
@end
Objective-C und das NeXTStep-Framework gefallen mir irgendwie immer besser. Es scheint tatsächlich so, als haben die Leute nachgedacht und Wert auf elegante Lösungen gelegt.