webentwicklung-frage-antwort-db.com.de

Gibt es irgendwelche Beschränkungen beim Speichern von Werten in NSUserDefaults?

Ich bin neu in der iPhone-Entwicklung und Objective C. Ich habe NSUserDefaults verwendet, um einige Werte in meiner App zu speichern. Ich weiß jedoch nicht, ob es irgendwelche Beschränkungen für das Speichern von Werten in NSUserDefaults. Gibt hilf mir das zu wissen.

Danke im Voraus.

59
Johnykutty

Solange auf dem iPhone/iPad genügend Speicherplatz vorhanden ist, können Sie NSUserDefault-Werte speichern. Alle diese Werte werden in einer .plist-Datei gespeichert, und diese Datei ist sehr klein, meistens unter 1 KB (sofern Sie nicht viele Daten speichern).

46
user914372

Es gibt Grenzen für die Arten, die Sie speichern dürfen: Es müssen alle Property List-Objekte sein, nämlich NSString, NSNumber, NSData, NSArray und NSDictionary. Außerdem können Sie NSArray und NSDictionary nur speichern, wenn die Werte auch Eigenschaftslistenobjekte sind. Außerdem müssen alle Schlüssel der NSDictionary Zeichenfolgen sein.

Beachten Sie, dass sich ein Objekt wie UIColor nicht in der obigen Liste befindet. Wenn Sie also eine Farbe in der Standarddatenbank speichern möchten, müssen Sie diese zuerst in einen String oder ein Datenobjekt konvertieren und dann beim Lesen der Standardwerte zurückkonvertieren.

In Bezug auf Größenbeschränkungen gibt es keine, die dokumentiert sind. Beachten Sie jedoch, dass alle Daten als Eigenschaftslistendatei gespeichert werden. Die gesamte Datei wird als Ganzes eingelesen und geschrieben. Wenn Sie NSUserDefaults verwenden, um eine große Datenmenge zu speichern, die sich nur in Teilen ändert, verlieren Sie viel Zeit für unnötige E/A.

42
benzado

Jeder hat die direkte Frage beantwortet: "Gibt es eine Grenze?" Ich fand jedoch, dass dieser Thread wirklich nach "wie viel ist sucht, um in UserDefaults gespeichert zu werden?"

Wenn Sie nach dieser Antwort suchen, finden Sie hier einen nützlichen Thread . Die Antworten, die ich als hilfreich empfunden habe, waren, zu Ihrer Projektdatei zu gehen und sich die Dateigröße von plist anzusehen:

5 Objekte sind fast nichts. Es wird Dir gut gehen!


Auf meinem Rechner habe ich ungefähr 28 Megabyte Daten in meinen Benutzervorgaben. Das macht überhaupt keine Probleme.


Aus der allgemeinen Programmiererfahrung mit Arrays würde ich vermuten, dass die Leistung schnell abnimmt, wenn Sie in die 1000er-Reihe geraten, abhängig von der Elementgröße. Daher hätte ich in einem Programm kein Problem mit dem Speichern einiger hundert Elemente. Demnach würde ich wahrscheinlich früher oder später mit einer sqlite3-Datenbank oder -Koredaten beginnen, wenn ich Sie wäre.

Wichtig zu beachten:

Die obigen Ausführungen haben meine Bedenken gelindert, dass meine wachsende Anzahl von Standardwerten (jetzt etwa 20-25) Probleme bereiten würde. Ich benutze bereits CoreData, also habe ich überlegt, welche Version ich verwenden soll, da meine Anzahl an erlaubten Benutzereinstellungen/Anpassungen immer länger wird. Ich bleibe also bei den Benutzervorgaben.

Wie auch immer, wird die Datei als Ganzes gelesen und geschrieben. Lesen Sie also 20 Schlüssel-/Zeichenwörterbücher und 5 Schlüssel-/Boolesche Wörterbücher, um nur eine Zeichenfolge abzurufen ... nicht gerade ideal. Wenn es der Leistung jedoch nicht schadet und Sie eine Menge Code sparen, warum nicht?

8
Dave G

Es gibt keine Begrenzung für das Speichern von Werten in NSUserDefaults.

4
Manmay

Die einzige Speicherbeschränkung in NSUserDefaults ist die Gerätespeicherkapazität .

Soweit verfügbarer Speicherplatz in einem iOS Gerät , Sie können praktisch Daten in NSUserDefaults speichern. Das Schlüsselpaar - wird in einer xml-strukturierten Datei gespeichert (. plist) welches in einem App Bundle gespeichert ist.

Das System mit benutzerdefinierten Standardeinstellungen und der Schlüsselwertspeicher dienen beide zum Speichern einfacher Datentypen - Zeichenfolgen, Zahlen, Daten , Boolean Werte, [~ # ~] url [~ # ~] s, data Objekte und so weiter —In einer Eigenschaftsliste . Die Verwendung einer Eigenschaftsliste bedeutet auch, dass Sie Ihre Präferenzdaten mithilfe von Array- und Wörterbuchtypen organisieren können. Sie können auch andere Objekte in einer Eigenschaftsliste speichern, indem Sie sie zuerst in ein NSData -Objekt codieren.

4
Adromil Balais

Von iOS-SDK-Codes und Apple-Dokument. .

extension UserDefaults {


    /*!
     NSUserDefaultsSizeLimitExceededNotification is posted on the main queue when more data is stored in user defaults than is allowed. Currently there is no limit for local user defaults except on tvOS, where a warning notification will be posted at 512kB, and the process terminated at 1MB. For ubiquitous defaults, the limit depends on the logged in iCloud user.
     */
    @available(iOS 9.3, *)
    public class let sizeLimitExceededNotification: NSNotification.Name


    // ....
 }   


Zusammenfassung

  1. Momentan gibt es keine Begrenzung für die Standardeinstellungen für lokale Benutzer 
  2. Auf tvOS, wo eine Warnmeldung bei 512 KB angezeigt wird und der Prozess bei 1 MB beendet wird.
  3. Bei allgegenwärtigen Standardwerten hängt das Limit vom angemeldeten iCloud-Benutzer ab.
3
AechoLiu

Wie bereits erwähnt: Ich habe keine Größenbeschränkung (außer physischem Speicher) für das Speichern von Daten in einer .plist (z. B. UserDefaults). Es ist also keine Frage von WIE VIEL.

Die eigentliche Frage sollte sein, WIE OFT Sie neue/geänderte Werte schreiben ... Und dies hängt mit dem Batterieverbrauch zusammen, den diese Schreibvorgänge verursachen.

IOS hat keine Chance, ein physisches Schreiben auf die Festplatte zu vermeiden, wenn sich ein einzelner Wert ändert, nur um die Datenintegrität zu erhalten. In Bezug auf UserDefaults bewirkt dies, dass die gesamte Datei auf die Festplatte geschrieben wird. 

Dadurch wird die "Festplatte" hochgefahren und bleibt für längere Zeit eingeschaltet, und es wird verhindert, dass IOS in den Energiesparmodus wechselt.

Aus dem "Energieeffizienzhandbuch für iOS-Apps":

Minimieren Sie das Schreiben von Daten. Schreiben Sie Dateien nur dann, wenn sich deren Inhalt geändert hat, und fassen Sie die Änderungen nach Möglichkeit in einem einzigen Schreibvorgang zusammen.Vermeiden Sie das Schreiben einer ganzen Datei, wenn sich nur wenige Bytes geändert haben.Wenn Sie häufig kleine Teile großer Dateien ändern, sollten Sie stattdessen eine Datenbank zum Speichern der Daten in Betracht ziehen.

READS sind kein Problem, da alle Werte im Arbeitsspeicher zwischengespeichert werden.

2
Hardy_Germany

Meines Wissens gibt es keine Begrenzung für das Speichern in NSUserdefaults.

2
Tendulkar

Unabhängig von der maximal zulässigen Dateigröße befindet sich das Laufwerk. Sie können diesen Code verwenden, um es auszuprobieren!

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *myKey = @"key";
int sizeOfFile = 1024; // Fill in proper file size here
NSData myObject;
NSString *someFilePath = @"PathToYourFileHere";

for(int i = 1; i < 9999999999999999; i++)
{
  myObject = [NSData dataWithContentsOfFile:someFilePath];
  [defaults setObject:myObject forKey:[NSString stringWithFormat:@"%@%i", myKey, i]];
  NSLog(@"Iteration: %i, TotalWritten: %i", i, i * sizeOfFile);
}
0
Esqarrouth