Як перетворити NSArray на NSData?


82

Хто-небудь може сказати мені, як перетворити an NSArrayна an NSData? У мене є NSArray. Мені потрібно надіслати його до NSInputStream. Для того , щоб зробити це мені потрібно перетворити NSArrayв NSData.

Будь ласка, допоможіть мені, я тут застряг.

Відповіді:


190

Використовуйте NSKeyedArchiver (що є останнім реченням посилання Гарретта):

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];

Зверніть увагу, що всі об’єкти, що знаходяться у, arrayповинні відповідати NSCodingпротоколу. Якщо це користувальницькі об'єкти, то це означає, що вам потрібно прочитати про об'єкти кодування та декодування .

Зауважте, що це створить досить важкий для читання формат списку властивостей, але може обробляти дуже широкий діапазон об’єктів. Якщо у вас дуже простий масив (наприклад, рядки), ви можете використовувати NSPropertyListSerialization, який створює трохи простіший список властивостей:

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

Існує також константа формату XML, яку ви можете передати, якщо хочете, щоб її можна було прочитати на дроті.


93

Дещо пов'язано з цим, ось як ви перетворили б NSData назад у NSArray:

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data]

5
Переконайтеся, що це NSKeyedUnarchiver, а не NSKeyedArchiver. Це може бути легка помилка при використанні автозаповнення.
Шон

2
Ця відповідь у поєднанні з обраною відповіддю зверху має бути достатньою для архівування / архівування будь-якого сумісного об'єкта до / з NSData
Скотт D


3

Я використав цей код.

 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

Ви можете зробити це-

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

1

У iOS 9+ використовуйте це, будь ласка:

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

Старіша версія цього застаріла в iOS 8.


1

Стрімкий:

let data = NSKeyedArchiver.archivedData(withRootObject: jsonArray)
print(data)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.