Jak przekonwertować NSArray na NSData?

82

Czy ktoś może mi powiedzieć, jak przekonwertować an NSArrayna NSData? Mam NSArray. Muszę to wysłać do NSInputStream. Aby to zrobić, muszę przekonwertować NSArrayplik na NSData.

Proszę, pomóż mi, utknąłem tutaj.

satynowy
źródło

Odpowiedzi:

190

Użyj NSKeyedArchiver (które jest ostatnim zdaniem linków postu Garretta):

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];

Zauważ, że wszystkie obiekty w programie arraymuszą być zgodne z NSCodingprotokołem. Jeśli są to obiekty niestandardowe, oznacza to, że musisz poczytać o obiektach kodowania i dekodowania .

Zauważ, że stworzy to dość trudny do odczytania format listy właściwości, ale może obsłużyć bardzo szeroki zakres obiektów. Jeśli masz bardzo prostą tablicę (na przykład ciągi znaków), możesz użyć NSPropertyListSerialization, która tworzy nieco prostszą listę właściwości:

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

Istnieje również stała formatu XML, którą możesz przekazać, jeśli wolisz, aby była czytelna w sieci.

Rob Napier
źródło
93

Z nieco pokrewnej notatki, oto jak przekonwertować NSData z powrotem na NSArray:

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data]
Michael Thiel
źródło
5
Upewnij się, że jest to NSKeyedUnarchiver, a nie NSKeyedArchiver. Podczas korzystania z autouzupełniania łatwo popełnić błąd.
Sean
2
Ta odpowiedź, w połączeniu z odpowiedzią wybraną powyżej, powinna wystarczyć do zarchiwizowania / przywrócenia z archiwum dowolnego zgodnego obiektu do / z NSData
Scott D
3

Nie jestem pewien, czy to ci pomoże, ale jest to łącze do NSMutableArray do NSData .

Garrett
źródło
Dzięki za szybką odpowiedź, sprawdziłem, że wcześniej nie pomogło.
satish
3

Użyłem tego kodu.

 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
źródło
1

Możesz to zrobić-

NSArray *array= [NSArray array];
NSData *dataArray = [NSKeyedArchiver archivedDataWithRootObject:array];
Nitesh
źródło
1

W iOS 9+ użyj tego:

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

Starsza wersja tego rozwiązania została wycofana w iOS 8.

NeilNie
źródło
1

Szybki:

let data = NSKeyedArchiver.archivedData(withRootObject: jsonArray)
print(data)
ioopl
źródło