Làm cách nào tôi có thể chuyển đổi NSDadata sang NSData và ngược lại?


158

Tôi đang gửi NSStringUIImagesử dụng bluetooth. Tôi quyết định lưu trữ cả trong một NSDictionaryvà sau đó chuyển đổi từ điển sang NSData.

Câu hỏi của tôi là làm thế nào để chuyển đổi NSDictionaryđể NSDatavà ngược lại?

Câu trả lời:


361

NSDadata -> NSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData -> NSDadata:

NSDictionary *myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:myData];

Đối với NSData -> NSDipedia, việc chuyển sang NSDipedia dường như không cần thiết.
Pang

51

NSDadata -> NSData:

NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:yourDictionary forKey:@"Some Key Value"];
[archiver finishEncoding];
[archiver release];

// Here, data holds the serialized version of your dictionary
// do what you need to do with it before you:
[data release];

NSData -> NSDadata

NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
NSDictionary *myDictionary = [[unarchiver decodeObjectForKey:@"Some Key Value"] retain];
[unarchiver finishDecoding];
[unarchiver release];
[data release];

Bạn có thể làm điều đó với bất kỳ lớp nào phù hợp với NSCoding.

nguồn


1
Không lấy bất cứ điều gì từ câu trả lời này, mà chỉ là một cái đầu không tuân thủ ARC
Madbreaks

10
Có, câu trả lời của tôi là từ năm 2011 nơi ARC không tồn tại
LeonS

41

Sử dụng NSJSONSerialization:

NSDictionary *dict;
NSData *dataFromDict = [NSJSONSerialization dataWithJSONObject:dict
                                                       options:NSJSONWritingPrettyPrinted
                                                         error:&error];

NSDictionary *dictFromData = [NSJSONSerialization JSONObjectWithData:dataFromDict
                                                             options:NSJSONReadingAllowFragments
                                                               error:&error];

Trả về mới nhất id, do đó, nên kiểm tra loại đối tượng được trả về sau khi bạn truyền (ở đây tôi chuyển sang NSDipedia).


23

Trong Swift 2, bạn có thể làm theo cách này:

var dictionary: NSDictionary = ...

/* NSDictionary to NSData */
let data = NSKeyedArchiver.archivedDataWithRootObject(dictionary)

/* NSData to NSDictionary */
let unarchivedDictionary = NSKeyedUnarchiver.unarchiveObjectWithData(data!) as! NSDictionary

Trong Swift 3 :

/* NSDictionary to NSData */
let data = NSKeyedArchiver.archivedData(withRootObject: dictionary)

/* NSData to NSDictionary */
let unarchivedDictionary = NSKeyedUnarchiver.unarchiveObject(with: data)

Đã không làm việc ! Mã Swift 3 tương đương không hoạt động. let data = NSKeyedArchiver.archivingData (withRootObject: dataFromNetwork) [_SwiftValue encodeWithCoder:]: bộ chọn không được nhận dạng được gửi đến ví dụ ...
huyền thoại mã hóa

Đánh giá cao phản ứng nhanh chóng của bạn. Ý tôi là thế này - mã Swift 3 cũng không hoạt động. Dữ liệu của tôi là từ thư viện HTTP 3lvis / mạng, nó thuộc Any?loại. Nhưng nó cho thấy lỗi chuyển đổi từ NSDictionarysang NSData. Vì vậy, tôi đã thử mã của bạn. Nó không hoạt động.
huyền thoại mã hóa

17

NSDadata từ NSData

http://www.cocoanetic.com/2009/09/nsdipedia-from-nsdata/

NSDixi đến NSData

Bạn có thể sử dụng lớp NSPropertyListSerialization cho điều đó. Hãy xem phương pháp của nó:

+ (NSData *)dataFromPropertyList:(id)plist format:(NSPropertyListFormat)format
                              errorDescription:(NSString **)errorString

Trả về một đối tượng NSData chứa danh sách thuộc tính đã cho theo định dạng đã chỉ định.


Đây là một giải pháp rất thanh lịch cho hầu hết các nhà phát triển Mac OS.
mjl007

0

Hãy thử cái này

NSError *error;
NSDictionary *responseJson = [NSJSONSerialization JSONObjectWithData:webData
                                options:NSJSONReadingMutableContainers
                                error:&error];

response, không phải responce. Tôi đã sửa lỗi này cho bạn.
Alex Zavatone
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.