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

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

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

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

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

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

5 ответов


можно использовать 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];

расшифрую:

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

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

NSDictionary - > NSData:

    NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData - > NSDictionary:

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

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

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