Próbuję uratować NSDictionary
z wartościami tablicowymi do NSUserDefaults
ale mam dziwne kłopoty.
Mój NSDictionary
ma NSStrings
dla keys
i każdy value
jest NSArray
z NSNumbers
. Kiedy drukuję słownik, wszystko jest w porządku. Piszę ten słownik do NSUserDefaults
i jeśli przeczytam to od razu, wszystko jest w porządku. Korzystanie z tego wszystko wygląda dobrze:
[[NSUserDefaults standardUserDefaults] setObject:self.selectedOptionPositions
forKey:PREF_OPTIONS_KEY];
[[NSUserDefaults standardUserDefaults] synchronize];
//THIS PRINT EVERYTHING OUT EXACTLY AS IT SHOULD!
NSLog(@"read after write: %@", [[NSUserDefaults standardUserDefaults]
objectForKey:PREF_OPTIONS_KEY]);
Problem pojawia się, gdy tworzę nową instancję klasy, która to obsługuje. Kiedy tworzę nowe wystąpienie klasy i w metodzie init, sprawdź plik NSDictionary
jak na przykład:
NSLog(@"read initial: %@", [[NSUserDefaults standardUserDefaults]
objectForKey:PREF_OPTIONS_KEY]);
Kiedy drukuję ten dziennik, plik NSDictionary
zawiera wszystkie klawiatura ale wszystkie values
są teraz puste! Wszystkie nowo dodane keys
istnieją po odtworzeniu klasy, ale nie values
trwać.
Co tu może być nie tak? Konsola nie zawiera ostrzeżeń ani błędów.
Odpowiedzi:
14 dla odpowiedzi № 1Spróbuj tego:
Możesz użyć NSKeyedArchiver do zapisania swojego słownika w NSData, które możesz przechowywać wśród preferencji.
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.selectedOptionPositions];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:PREF_OPTIONS_KEY];
Aby odzyskać dane:
NSData *dictionaryData = [defaults objectForKey:PREF_OPTIONS_KEY];
NSDictionary *dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:dictionaryData];
Jak w Dokumentacja programisty iOS dla NSKeyedArchiver tu jest napisane:
NSKeyedArchiver, konkretna podklasa NSCoder,zapewnia sposób koduje obiekty (i wartości skalarne) w niezależną od architektury format, który można zapisać w pliku. Podczas archiwizowania zestawu plików obiekty, informacje o klasie i zmienne instancji dla każdego obiektu są zapisywane w archiwum. Klasa towarzysząca NSKeyedArchiver, NSKeyedUnarchiver, dekoduje dane w archiwum i tworzy zestaw plików obiekty równoważne z oryginalnym zestawem.