Znalazłem jedną alternatywę, przed zapisaniem koduję obiekt główny ( NSArray
obiekt) za pomocą NSKeyedArchiver
, który kończy się na NSData
. Następnie użyj UserDefaults, zapisz plik NSData
.
Kiedy potrzebuję danych, czytam NSData
i używam NSKeyedUnarchiver
do konwersji z NSData
powrotem do obiektu.
Jest to trochę uciążliwe, ponieważ NSData
za każdym razem muszę konwertować na / z , ale po prostu działa.
Oto jeden przykład na żądanie:
Zapisać:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *arr = ... ; // set value
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr];
[defaults setObject:data forKey:@"theKey"];
[defaults synchronize];
Załaduj:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"theKey"];
NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Element w tablicy implementuje
@interface CommentItem : NSObject<NSCoding> {
NSString *value;
}
Następnie w realizacji CommentItem
, zapewnia dwie metody:
-(void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:value forKey:@"Value"];
}
-(id)initWithCoder:(NSCoder *)decoder
{
self.value = [decoder decodeObjectForKey:@"Value"];
return self;
}
Czy ktoś ma lepsze rozwiązanie?
Dziękuję wszystkim.
Jeśli zapisujesz obiekt w ustawieniach domyślnych użytkownika, wszystkie obiekty rekurencyjnie, aż do końca, muszą być obiektami listy właściwości. Zgodność z NSCoding nic tutaj nie znaczy - nie zakoduje
NSUserDefaults
ich automatycznieNSData
, musisz to zrobić sam. Jeśli twoja „lista obiektów, które implementująNSCoding
” oznacza obiekty, które nie są obiektami listy właściwości, to będziesz musiał coś z nimi zrobić przed zapisaniem ich do ustawień domyślnych użytkownika.FYI zajęcia listy właściwości są
NSDictionary
,NSArray
,NSString
,NSDate
,NSData
, iNSNumber
. Możesz pisać zmienne podklasy (takie jakNSMutableDictionary
) do preferencji użytkownika, ale odczytywane obiekty zawsze będą niezmienne.źródło
Czy wszystkie twoje klucze są w słowniku
NSString
? Myślę, że muszą być, aby zapisać słownik na liście właściwości.źródło
Najprostsza odpowiedź:
NSDictionary
jest tylko obiektem plist , jeśli klucze są NSStrings . Więc przechowuj „Klucz” jakNSString
wstringWithFormat
.Rozwiązanie :
Korzyści :
NULL
.źródło
Czy zastanawiałeś się nad wdrożeniem
NSCoding
protokołu? Umożliwi to kodowanie i dekodowanie na telefonie iPhone za pomocą dwóch prostych metod zaimplementowanych w programieNSCoding
. Najpierw musisz dodaćNSCoding
do swojej klasy.Oto przykład:
To jest w pliku .h
Następnie będziesz musiał zaimplementować dwie metody protokołu NSCoding.
Aby uzyskać więcej informacji, zapoznaj się z dokumentacją dotyczącą NSCoder. Przydało się to naprawdę w moich projektach, w których muszę zapisać stan aplikacji na iPhonie, jeśli aplikacja jest zamknięta i przywrócić ją do stanu, w którym jest ponownie włączona.
Kluczem jest dodanie protokołu do interfejsu, a następnie zaimplementowanie dwóch metod, które są jego częścią
NSCoding
.Mam nadzieję, że to pomoże!
źródło
Nie ma lepszego rozwiązania. Inną opcją byłoby po prostu zapisanie zakodowanego obiektu na dysku - ale to robi to samo. Oba kończą z NSData, który jest dekodowany, gdy chcesz go z powrotem.
źródło