¿Cómo convertir NSArray a NSData?

82

¿Alguien puede decirme cómo convertir un NSArrayen un NSData? Tengo un NSArray. Necesito enviarlo a un NSInputStream. Para hacer eso, necesito convertir el archivo NSArraya NSData.

Por favor ayúdame, estoy atrapado aquí.

satish
fuente

Respuestas:

190

Use NSKeyedArchiver (que es la última oración de los enlaces de Garrett de la publicación):

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];

Tenga en cuenta que todos los objetos arraydeben ajustarse al NSCodingprotocolo. Si se trata de objetos personalizados, significa que necesita leer más sobre codificación y decodificación de objetos .

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 tiene una matriz muy simple (cadenas, por ejemplo), es posible que desee utilizar NSPropertyListSerialization, que crea una lista de propiedades un poco más simple:

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 prefiere que sea legible en el cable.

Rob Napier
fuente
93

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

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data]
Michael Thiel
fuente
5
Asegúrese de que sea NSKeyedUnarchiver y no NSKeyedArchiver. Puede ser un error fácil de cometer al utilizar la función de 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
Scott D
3

No estoy seguro de si esto le ayudará, pero es un enlace para un NSMutableArray a NSData .

Garrett
fuente
Gracias por la respuesta rápida, he comprobado que antes no ayudó mucho.
sábado
3

Usé 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];
Avijit Nagare
fuente
1

Puedes hacerlo-

NSArray *array= [NSArray array];
NSData *dataArray = [NSKeyedArchiver archivedDataWithRootObject:array];
Nitesh
fuente
1

En iOS 9+, use esto, por favor:

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

La versión anterior de esto quedó obsoleta en iOS 8.

NeilNie
fuente
1

Rápido:

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