11

dispone di un'app che può scattare una foto e quindi caricarla su un server. codificandolo alla base 64 e passandolo attraverso un XMLRPC al mio server php.Converti nsdictionary in nsdata

voglio prendere informazioni NSDictionary che viene restituito dalla UIImagePickerController delegato

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

e convertirlo in NSData modo che io possa codificare.

quindi, come posso convertire NSDictionary in un NSData?

risposta

23

È possibile utilizzare un NSKeyedArchiver per serializzare NSDictionary su un oggetto NSData. Si noti che tutti gli oggetti nel dizionario dovranno essere serializzabili (implementare NSCoding a un certo punto nella loro struttura di ereditarietà) affinché funzioni.

Troppo pigro per passare attraverso i miei progetti per sollevare il codice, ecco un po 'da Internet:

Encode

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

ho provato implementando questo, ma continuo a ricevere un errore quando questo ry per codificarlo: 01-2011-08-30 15: 46: 18.468 Satshot [1986: 307] - [UIImage encodeWithCoder:]: selettore non riconosciuto inviato all'istanza 0x630de50 2011-08-30 15: 46: 18.502 Satshot [1986 : 307] *** Terminazione dell'app a causa dell'eccezione non rilevata 'NSInvalidArgumentException', motivo: '- [UIImage encodeWithCoder:]: selettore non riconosciuto inviato all'istanza 0x630de50' info è ciò che torno dal delegato UIImagePickerController che dovrebbe essere un nsdictionary . ho anche provato [archiver encodeObject: info] e ho ottenuto lo stesso errore. – Padin215

+0

l'errore si verifica su [archiver encodeRootObject: info]; ed è un errore "SIGABRT", per non dimenticare di menzionarlo. – Padin215

+2

UIImage non può essere serializzato con NSKeyedArchiver, non senza problemi. – Perception

4

Conosco un po' troppo tardi , ma nel caso qualcuno si imbatta in questo stesso problema. UIImage non è serializzabile, ma è possibile serializzare utilizzando il codice:

se l'immagine è JPG:

NSData *imagenBinaria = [NSData dataWithData:UIImageJPEGRepresentation(imagen, 0.0)]; 

// imagen is a UIImage object 

se l'immagine è PNG:

NSData *imagenBinaria = [NSData dataWithData:UIImagePNGRepresentation(imagen)]; 

// imagen is a UIImage object 
4

La classe NSPropertyListSerialization la danno maggior controllo sulla scrittura e la lettura degli elenchi di proprietà:

NSDictionary *dictionary = @{@"Hello" : @"World"}; 
NSData *data = [NSPropertyListSerialization dataWithPropertyList:dictionary 
              format:NSPropertyListBinaryFormat_v1_0 
              options:0 
              error:NULL]; 

Leggi:

NSData *data = ... 
NSPropertyListFormat *format; 
NSDictionary *dictionary = [NSPropertyListSerialization propertyListWithData:data 
                 options:0 
                 format:&format 
                 error:NULL]; 
+0

Viene visualizzato il messaggio di avviso –

+1

la lettura non è corretta ... Errore NSError *; Formato NSPropertyListFormat; NSDictionary * dictionary = [NSPropertyListSerialization propertyListWithData: self.inputFormEncodedDictionary options: 0 format: & format error: & error]; –

4

NSDictionary -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary]; 

NSData -> NSDictionary:

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

tre opzioni si verificano a me su questo, due menzionati in altre risposte NSKeyedArchiver e PropertyList, esiste anche NSJSONSeriali zazione che mi ha dato i dati più compatti in un semplice test.

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

risultati di dimensione per i diversi approcci piccolo al più grande

  • compactJson 46 byte
  • prettyJson 57 bytes
  • plist 91 byte
  • archiviati 316 byte