2015-09-02 29 views
5

Tôi đã đấu tranh với vấn đề này trong 5 ngày. Không phải trò đùa. Hãy giúp tôi! Đây là vấn đề mà tôi đang gặp phải.Lưu trữ một từ điển trong NSUserDefaults và sử dụng dữ liệu được lưu trữ.

Những gì tôi biết:

Tôi tuyên bố var addressDict = Dictionary<Int, Array<String>>() như là một biến toàn cầu. Bây giờ, tôi hiểu đoạn mã sau được sử dụng để nối thêm dữ liệu được lưu trữ trong địa chỉ của tôi và thay đổi kiểu để dữ liệu có thể được lưu trữ vào NSUserDefaults.

let data = NSKeyedArchiver.archivedDataWithRootObject(addressDict) //archiving 
self.defaults.setObject(data, forKey: "addressDict") //storing 
if let data2 = self.defaults.objectForKey("addressDict") as? NSData { 
    let addressDict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data2) 
} 

Bây giờ, mỗi khi tôi chạy ứng dụng, dữ liệu được lưu trữ trong addressDict2 bị ghi đè bởi tôi addressDict vì khi ứng dụng bắt đầu, không có dữ liệu trong addressDict. Vì vậy, mặc dù tôi có thể đã thêm một số dữ liệu vào addressDict2, nó bị ghi đè bởi addressDict không có dữ liệu. Vì vậy, để giải quyết vấn đề này tôi có thể chạy mã ở trên nhưng không có dòng, self.defaults.setObject(data, forKey: "addressDict") và bây giờ, addressDict2 không còn bị ghi đè bởi biến không chứa dữ liệu, addressDict. Vì vậy, dữ liệu tôi đã thêm được lưu trữ trong addressDict2. Tuy nhiên, nếu tôi làm điều này, tôi không còn có thể thêm thông tin mới vào addressDict2 vì tôi không còn self.defaults.setObject(data, forKey: "addressDict") nữa. Tôi hy vọng bạn thấy tiến thoái lưỡng nan của tôi ở đây ...

Những gì tôi muốn biết:

Đây là những gì tôi muốn mã của tôi để làm. Tôi muốn có thể nối thêm thông tin mới vào một số biến, giả sử addressDict2. Và khi ứng dụng bắt đầu, tôi muốn dữ liệu có trong addressDict2 được sao chép vào addressDict. Vì vậy, điều này sẽ gây ra addressDict để giữ dữ liệu mà tôi muốn giữ.

Những gì tôi đã cố gắng:

Để cố gắng giải thích những gì tôi muốn nói ở trên, đây là một số mã. Lưu ý, mã này không hoạt động, nó chỉ là, loại, làm rõ ý của tôi và hiển thị nếu mã sau đây hoạt động, nó sẽ giải quyết được vấn đề của tôi, tôi nghĩ (hãy sửa tôi nếu tôi sai). Vì vậy, trong viewDidLoad() của tôi, tôi sẽ phải cái gì đó như sau:

override func viewDidLoad() { 
    super.viewDidLoad() 

    if NSUserDefaults.standardUserDefaults().objectForKey("addressDict") != nil { 
     if let data2 = defaults.objectForKey("addressDict") as? NSData { 
      addressDict = NSKeyedUnarchiver.unarchiveObjectWithData(data2) //there is an error here that states: "Cannot assign a value of type AnyObject? to a value of type Dictionary<Int, Array<Strings>> 
     } 
    } 
} 

Vì vậy, bây giờ, khi tôi chạy mã này:

let data = NSKeyedArchiver.archivedDataWithRootObject(addressDict) //archiving 
self.defaults.setObject(data, forKey: "addressDict") //storing 
if let data2 = self.defaults.objectForKey("addressDict") as? NSData { 
    let addressDict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data2) 
} 

Các addressDict đây sẽ không còn được sản phẩm nào và sẽ không ghi đè addressDict2 với dữ liệu trống. Và tôi sẽ có thể sử dụng addressDict với tất cả dữ liệu được lưu trữ vĩnh viễn! Và cuộc sống sẽ tốt đẹp. Nhưng tôi không có ý tưởng làm thế nào để làm điều này.

P.S. Tôi nghiêm túc xin lỗi về độ dài của câu hỏi. Cảm ơn bạn đã dành thời gian!

+0

Tôi đã trả lời câu hỏi của bạn [ở đây] (http://stackoverflow.com/a/32264073/730701). Mã tôi đăng biên dịch và hoạt động tốt. Những gì bạn cần ở đây là một kiểu chữ đơn giản. – Adam

+0

Thực ra không cần sử dụng 'NSKeyedUnarchiver' vì một từ điển chứa các kiểu' Int', 'String' và' Array' là danh sách thuộc tính tuân thủ. – vadian

+0

@Adam, tôi không chắc chắn nếu bạn trả lời câu hỏi mà tôi đặt ra ở đây (tất nhiên, tôi có thể rất không chính xác). Tôi nghĩ rằng tôi tiến thêm một bước nữa bằng cách cố gắng, như @Rajatp, đặt nó, hợp nhất 'addressDict' và' addressDict2' để dữ liệu trong 'addressDict2' có thể được" đưa vào "' addressDict'. – aejhyun

Trả lời

1

khi đang lưu dữ liệu vào từ điển:

let foundationDictionary = NSMutableDictionary(dictionary: StoreDictionary) let dict = NSKeyedArchiver.archivedDataWithRootObject(foundationDictionary) NSUserDefaults.standardUserDefaults().setObject(dict, forKey: "yourkey") 

khi sử dụng dữ liệu đã lưu:

if NSUserDefaults.standardUserDefaults().objectForKey("UserDetails")!=nil { 

let dict : NSData = NSUserDefaults.standardUserDefaults().objectForKey("yourkey") as! NSData dictionaryName = NSKeyedUnarchiver.unarchiveObjectWithData(dict) as? NSDictionary 
} 
Các vấn đề liên quan