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!
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
In realtà non è necessario utilizzare 'NSKeyedUnarchiver' perché un dizionario contenente i tipi' Int', 'String' e' Array' è conforme alla lista di proprietà. – vadian
@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