Преобразование 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 байт