2015-09-02 6 views
5

Sono stato alle prese con questo problema per 5 giorni. Nessun scherzo. Per favore aiuto! Ecco il problema che sto incontrando.Memorizzazione di un dizionario in NSUserDefaults e utilizzo dei dati memorizzati.

quello che so:

ho dichiarato var addressDict = Dictionary<Int, Array<String>>() come una variabile globale. Ora, capisco che il seguente codice viene utilizzato per aggiungere i dati memorizzati nel mio addressDict e modificare il tipo in modo che i dati possano essere archiviati in 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) 
} 

Ora, ogni volta che faccio funzionare l'applicazione, i dati che vengono memorizzati in addressDict2 viene sovrascritta dal mio addressDict perché quando inizia l'app, non ci sono dati in addressDict. Quindi, anche se avrei potuto aggiungere alcuni dati a addressDict2, questo verrà sovrascritto da addressDict che non ha dati.

Così, al fine di risolvere questo problema posso eseguire il codice sopra, ma senza la linea, self.defaults.setObject(data, forKey: "addressDict"), e ora, il addressDict2 non viene più sovrascritto da un variabile che contiene alcun dato, addressDict. Quindi i dati che ho aggiunto sono memorizzati in addressDict2. Tuttavia, se lo faccio, non posso più aggiungere nuove informazioni in addressDict2 perché non ho più self.defaults.setObject(data, forKey: "addressDict"). Spero che si vede il mio dilemma qui ...

Quello che voglio sapere:

Questo è quello che vorrei il mio codice di fare. Voglio poter aggiungere nuove informazioni in alcune variabili, ad esempio addressDict2. E quando l'app si avvia, voglio che i dati che sono in addressDict2 siano copiati in addressDict. Quindi questo causerà il addressDict per contenere i dati che voglio che tengano.

Quello che ho provato:

Al fine di cercare di spiegare quello che volevo dire in precedenza, ecco qualche codice. Nota, questo codice non funziona, è solo per, tipo di, chiarire cosa intendo e per mostrare se il seguente codice potrebbe funzionare, risolverebbe il mio problema, penso (correggimi se ho torto). Così nel mio viewDidLoad(), avrei qualcosa di simile il seguente:

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>> 
     } 
    } 
} 

Così ora, quando si esegue questo codice:

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) 
} 

Il addressDict qui non sarà più vuota e non sovrascriverà addressDict2 con dati vuoti. E sarò in grado di utilizzare addressDict con tutti i dati memorizzati in modo permanente! E la vita andrà tutto bene. Ma non ho idea di come farlo.

P.S. Mi scuso seriamente per la lunghezza della domanda. Grazie per il tuo tempo!

+0

Ho già risposto alla tua domanda [qui] (http://stackoverflow.com/a/32264073/730.701). Il codice che ho postato compila e funziona bene. Quello che ti serve qui è un semplice typecast. – Adam

+0

In realtà non è necessario utilizzare 'NSKeyedUnarchiver' perché un dizionario contenente i tipi' Int', 'String' e' Array' è conforme alla lista di proprietà. – vadian

+0

@Adam, non sono sicuro che tu abbia risposto alla domanda che ho posto qui (ovviamente, posso benissimo essere errato). Penso di fare un ulteriore passo avanti provando, come @Rajatp, metterlo, unire 'addressDict' e' addressDict2' in modo che i dati in 'addressDict2' possano essere" messi in "' addressDict'. – aejhyun

risposta

1

durante il salvataggio di dati in dizionario:

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

durante l'utilizzo di dati salvati:

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

let dict : NSData = NSUserDefaults.standardUserDefaults().objectForKey("yourkey") as! NSData dictionaryName = NSKeyedUnarchiver.unarchiveObjectWithData(dict) as? NSDictionary 
} 
Problemi correlati