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