/ / iOS NSDictionary zapisany do NSUserDefaults bez zapisywania wartości - ios, objective-c, nsarray, nsdictionary, nsuserdefaults

iOS NSDictionary zapisany w NSUserDefaults nie zapisuje wartości - ios, cel-c, nsarray, nsdictionary, nsuserdefaults

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 № 1

Spró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.