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.

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.


93

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

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data]

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

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

1

Możesz to zrobić-

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

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.


1

Szybki:

let data = NSKeyedArchiver.archivedData(withRootObject: jsonArray)
print(data)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.