2009-08-17 18 views
75

¿Alguien me puede decir cómo convertir un NSArray a un NSData? Tengo un NSArray. Necesito enviarlo a un NSInputStream. Para hacer eso, necesito convertir el NSArray a un NSData. Por favor, ayúdenme, estoy atrapado aquí.Cómo convertir NSArray a NSData?

Respuesta

183

Uso NSKeyedArchiver (que es la última frase del puesto enlaces Garrett):

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array]; 

Tenga en cuenta que todos los objetos en array deben cumplir con el protocolo NSCoding. Si se trata de objetos personalizados, significa que debe leer en Encoding and Decoding Objects.

Tenga en cuenta que esto creará un formato de lista de propiedades bastante difícil de leer, pero puede manejar una amplia gama de objetos. Si usted tiene una gama muy simple (cadenas, por ejemplo), es posible que desee utilizar NSPropertyListSerialization, lo que crea un poco más simple lista de propiedades:

NSString *error; 
NSData *data = [NSPropertyListSerialization dataFromPropertyList:array format:NSPropertyListBinaryFormat_v1_0 errorDescription:&error]; 

También hay una constante de formato XML que puede pasar si prefiero que ser legible en el cable.

+0

+1 para la mejor respuesta y muchas gracias. – Shivaay

3

No estoy seguro si esto lo ayudará, pero es un enlace para NSMutableArray to NSData.

+0

Gracias por la rápida respuesta , lo he comprobado que antes no ayudaba mucho. – satish

91

En una nota algo relacionada, así es como usted convertir el NSData de nuevo a un NSArray:

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data] 
+5

Asegúrese de que sea NSKeyedUnarchiver y no NSKeyedArchiver. Puede ser un error fácil de hacer cuando se usa autocompletar. – Sean

+2

Esta respuesta, junto con la respuesta elegida de arriba, debería ser suficiente para archivar/desarchivar cualquier objeto compatible hacia/desde NSData –

1

Usted puede hacer esto:

NSArray *array= [NSArray array]; 
NSData *dataArray = [NSKeyedArchiver archivedDataWithRootObject:array]; 
0

He utilizado este código.

NSError *error; 
NSMutableData *jsonData = [[NSJSONSerialization dataWithJSONObject:yourDemoArray 
                    options:0 // Pass 0 if you don't care about the readability of the generated string 
                    error:&error] copy]; 
0

En iOS 9+ utilizar este favor:

NSArray *array = [[NSArray alloc] init]; 
NSData *data = [NSPropertyListSerialization dataWithPropertyList:array format:NSPropertyListBinaryFormat_v1_0 options:0 error:nil]; 

La versión anterior de esta desfasada y en iOS 8.

0

Swift:

let data = NSKeyedArchiver.archivedData(withRootObject: jsonArray) 
print(data)