Làm thế nào để chuyển đổi NSArray sang NSData?


82

Bất cứ ai có thể cho tôi biết làm thế nào để chuyển đổi một NSArraythành một NSData? Tôi có một NSArray. Tôi cần phải gửi nó cho một NSInputStream. Để làm điều đó, tôi cần phải chuyển đổi NSArraythành một NSData.

Xin hãy giúp tôi, tôi đang bị mắc kẹt ở đây.

Câu trả lời:


190

Sử dụng NSKeyedArchiver (là câu cuối cùng của bài đăng liên kết Garrett):

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];

Lưu ý rằng tất cả các đối tượng trong arrayphải tuân theo NSCodinggiao thức. Nếu đây là các đối tượng tùy chỉnh, thì điều đó có nghĩa là bạn cần đọc về Đối tượng Mã hóa và Giải mã .

Lưu ý rằng điều này sẽ tạo ra một định dạng danh sách thuộc tính khá khó đọc, nhưng có thể xử lý một loạt các đối tượng. Nếu bạn có một mảng rất đơn giản (ví dụ: chuỗi), bạn có thể muốn sử dụng NSPropertyListSerialization, tạo danh sách thuộc tính đơn giản hơn một chút:

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

Ngoài ra còn có một hằng số định dạng XML mà bạn có thể chuyển nếu bạn muốn nó có thể đọc được trên dây.


93

Trên một lưu ý có liên quan, đây là cách bạn sẽ chuyển đổi NSData trở lại NSArray:

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data]

5
Đảm bảo rằng đó là NSKeyedUnarchiver chứ không phải NSKeyedArchiver. Có thể là một lỗi dễ mắc phải khi sử dụng tính năng tự động hoàn thành.
Sean

2
Câu trả lời này, cùng với những câu trả lời được lựa chọn từ trên nên là đủ để lưu trữ / huỷ lưu trữ bất kỳ đối tượng tương thích đến / từ NSData
Scott D

3

Tôi không chắc liệu điều này có giúp ích được cho bạn hay không, nhưng đó là một liên kết giữa NSMutableArray với NSData .


Cảm ơn vì đã trả lời nhanh chóng, tôi đã kiểm tra trước đó không giúp được gì nhiều.
thỏa mãn

3

Tôi đã sử dụng mã này.

 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

Bạn có thể làm được việc này-

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

1

Trong iOS 9+, vui lòng sử dụng cái này:

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

Phiên bản cũ hơn của tính năng này không được dùng nữa trong iOS 8.


1

Swift:

let data = NSKeyedArchiver.archivedData(withRootObject: jsonArray)
print(data)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.