CK knows Wayne!

NSDictionary aus NSData

Published at by Christian Kruse, updated at
Filed under: Computer

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.

Already one comment!

Comment Feed: RSS / Atom
Gravatar

Andreas Prang wrote

at

Vielen Dank !

Die Kategorie funktioniert bestens. Genau das habe ich gesucht.

Andreas

Your Comment

You can use MarkDown to format your comment: *Word* for italic, **Word** for bold, images will get removed.




Because of massive spam attacks you may only post if you can answer the following question: