Ich habe eine Alternative herausgefunden, bevor ich speichere, codiere ich das Stammobjekt ( NSArray
Objekt) mit NSKeyedArchiver
, das mit endet NSData
. Verwenden Sie dann UserDefaults und speichern Sie die NSData
.
Wenn ich die Daten benötige, lese ich sie aus NSData
und NSKeyedUnarchiver
konvertiere sie NSData
zurück zum Objekt.
Es ist ein wenig umständlich, weil ich NSData
jedes Mal zu / von konvertieren muss, aber es funktioniert einfach.
Hier ist ein Beispiel pro Anfrage:
Sparen:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *arr = ... ; // set value
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr];
[defaults setObject:data forKey:@"theKey"];
[defaults synchronize];
Belastung:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"theKey"];
NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Das Element im Array wird implementiert
@interface CommentItem : NSObject<NSCoding> {
NSString *value;
}
Dann CommentItem
bietet bei der Implementierung von zwei Methoden:
-(void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:value forKey:@"Value"];
}
-(id)initWithCoder:(NSCoder *)decoder
{
self.value = [decoder decodeObjectForKey:@"Value"];
return self;
}
Hat jemand eine bessere Lösung?
Vielen Dank an alle.
Wenn Sie ein Objekt in den Standardeinstellungen des Benutzers speichern, müssen alle Objekte rekursiv bis zum Ende nach unten Eigenschaftenlistenobjekte sein. Die Konformität mit NSCoding bedeutet hier nichts - codiert
NSUserDefaults
sie nicht automatischNSData
, Sie müssen dies selbst tun. Wenn Ihre "Liste der zu implementierendenNSCoding
Objekte" Objekte bedeutet, die keine Objekte der Eigenschaftsliste sind, müssen Sie etwas damit tun, bevor Sie sie in den Benutzerstandards speichern.Zu Ihrer Information der Eigenschaftsliste Klassen sind
NSDictionary
,NSArray
,NSString
,NSDate
,NSData
, undNSNumber
. Sie können veränderbare Unterklassen (wieNSMutableDictionary
) in Benutzereinstellungen schreiben, aber die Objekte, die Sie auslesen, sind immer unveränderlich.quelle
Sind alle Ihre Schlüssel im Wörterbuch
NSString
? Ich denke, sie müssen es sein, um das Wörterbuch in einer Eigenschaftsliste zu speichern.quelle
Einfachste Antwort:
NSDictionary
ist nur ein Plist-Objekt , wenn die Schlüssel NSStrings sind . Speichern Sie also den "Schlüssel" wieNSString
beistringWithFormat
.Lösung:
Leistungen :
NULL
.quelle
Haben Sie darüber nachgedacht, das
NSCoding
Protokoll umzusetzen ? Auf diese Weise können Sie auf dem iPhone mit zwei einfachen Methoden codieren und decodieren, die mit dem implementiert werdenNSCoding
. Zuerst müssten Sie dasNSCoding
zu Ihrer Klasse hinzufügen .Hier ist ein Beispiel:
Dies ist in der .h-Datei
Dann müssen Sie zwei Methoden des NSCoding-Protokolls implementieren.
Weitere Informationen finden Sie in der Dokumentation zu NSCoder. Das hat sich für meine Projekte als sehr nützlich erwiesen, bei denen ich den Status der Anwendung auf dem iPhone speichern muss, wenn die Anwendung geschlossen ist, und sie wieder in den Status zurücksetzen muss, wenn sie wieder aktiviert ist.
Der Schlüssel besteht darin, das Protokoll zur Schnittstelle hinzuzufügen und dann die beiden Methoden zu implementieren, die Teil von sind
NSCoding
.Ich hoffe das hilft!
quelle
Es gibt keine bessere Lösung. Eine andere Möglichkeit wäre, das codierte Objekt einfach auf der Festplatte zu speichern - aber das ist das Gleiche. Beide haben NSData, die dekodiert werden, wenn Sie sie zurückhaben möchten.
quelle