Преобразование nsdictionary в nsdata

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

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

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

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

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

Ответ 1

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

Слишком ленив, чтобы пройти через мои проекты, чтобы поднять код, так вот некоторые из Интернета:

Кодировать

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];

Ответ 2

Я знаю слишком поздно, но на всякий случай кто-то сталкивается с этой проблемой. 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

Класс 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

NSDictionary → NSData:

    NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData → NSDictionary:

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

Ответ 5

Мне приходят три варианта: два упомянутых в других ответах 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 bytes
  • архивировано 316 байт