¿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í.

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.


93

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

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data]

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

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

1

Puedes hacerlo-

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

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.


1

Rápido:

let data = NSKeyedArchiver.archivedData(withRootObject: jsonArray)
print(data)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.