Конвертировать nsdictionary в nsdata - PullRequest
12 голосов
/ 31 августа 2011

есть приложение, которое может сделать снимок, а затем загрузить на сервер.закодировать его в base 64 и передать через XMLRPC на мой php-сервер.

Я хочу взять информацию NSDictionary, возвращаемую из делегата UIImagePickerController

-(void) imagePickerController:(UIImagePickerController *)imagePicker didFinishPickingMediaWithInfo:(NSDictionary *)info

, и преобразовать ее в NSData, чтобыя могу закодировать его.

так, как я могу преобразовать NSDictionary в NSData?

Ответы [ 5 ]

24 голосов
/ 31 августа 2011

Вы можете использовать NSKeyedArchiver для сериализации NSDictionary в объект NSData. Обратите внимание, что все объекты в словаре должны быть сериализуемыми (реализовать NSCoding в некоторой точке их дерева наследования), чтобы это работало.

Лень просматривать мои проекты, чтобы поднять код, поэтому вот некоторые из Интернета:

Encode

NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:yourDictionary forKey:@"Some Key Value"];
[archiver finishEncoding];
[archiver release];
/** data is ready now, and you can use it **/
[data release];

Decode:

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];
4 голосов
/ 22 ноября 2013

NSDictionary -> NSData:

    NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDictionary:

    NSDictionary *myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:myData];
4 голосов
/ 13 апреля 2013

Класс NSPropertyListSerialization дает вам максимальный контроль над написанием и чтением списков свойств:

NSDictionary *dictionary = @{@"Hello" : @"World"};
NSData *data = [NSPropertyListSerialization dataWithPropertyList:dictionary
                                            format:NSPropertyListBinaryFormat_v1_0
                                            options:0
                                            error:NULL];

Чтение:

NSData *data = ...
NSPropertyListFormat *format;
NSDictionary *dictionary = [NSPropertyListSerialization propertyListWithData:data
                                                        options:0
                                                        format:&format
                                                        error:NULL];
4 голосов
/ 20 декабря 2012

Я знаю, что слишком поздно, но на всякий случай кто-то сталкивается с этой же проблемой.UIImage не сериализуем, но вы можете сериализовать его, используя код:

, если ваше изображение JPG:

NSData *imagenBinaria = [NSData dataWithData:UIImageJPEGRepresentation(imagen, 0.0)]; 

// imagen is a UIImage object

, если ваше изображение PNG:

NSData *imagenBinaria = [NSData dataWithData:UIImagePNGRepresentation(imagen)]; 

// imagen is a  UIImage object
3 голосов
/ 13 ноября 2014

В этом мне встречаются три варианта, два упомянутых в других ответах NSKeyedArchiver и PropertyList, также есть NSJSONSerialization, который дал мне самые компактные данные в простом тесте.

NSDictionary *dictionary = @{@"message":@"Message from a cool guy", @"flag":@1};
NSData *prettyJson = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:nil];
NSData *compactJson = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:nil];
NSData *plist = [NSPropertyListSerialization dataWithPropertyList:dictionary
                                                           format:NSPropertyListBinaryFormat_v1_0
                                                          options:0
                                                            error:NULL];
NSData *archived = [NSKeyedArchiver archivedDataWithRootObject:dictionary];`

Размер результатов для разных подходов от наименьшего к наибольшему

  • compactJson 46 байтов
  • prettyJson 57 байт
  • plist 91 байт
  • в архиве 316 байт
...