iphone - 変換 - swift dictionary to data




nsdictionaryからnsdataに変換 (4)

NSKeyedArchiverとPropertyListという他の回答で言及されている3つのオプションがこれに私に思い浮かぶ、私に簡単なテストの中で最もコンパクトなデータを与えてくれた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バイト
  • 91バイト
  • アーカイブされた316バイト

写真を撮ってからサーバーにアップロードできるアプリがあります。 それをbase 64にエンコードしてXMLRPCを通して私のphpサーバーに渡します。

UIImagePickerControllerデリゲートから返されるNSDictionary情報を取得したい

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

それをNSDataに変換して、エンコードできるようにします。

それでは、どうやってNSDictionaryをNSDataに変換できますか?


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

NSDictionary - > NSData:

    NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData - > NSDictionary:

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

私は少し遅すぎることを知っています、しかし念のために誰かがこの同じ問題にぶつかった場合。 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




nsdata