2016-05-27 13 views
0

Ich habe ein Spiel und ich ständig Benutzerfortschritt speichern. Es ist ein extrem schnell fortschreitendes Spiel und an einigen Stellen im Spiel kann es sechs Mal pro Sekunde zu einer großen Benutzerentwicklung kommen, weshalb ich einige Progressionsvariablen in NSUserDefaults speichern und 6 Mal pro Sekunde synchronisieren muss. Das funktioniert gut auf meinem iPhone6s 64GB, aber ich befürchte, es könnte nicht etwas sein, das ein iPhone4 16GB verarbeiten kann.NSUserDefaults Leistungsprobleme

Ich habe keine Möglichkeit, es zu testen, weil Simulator mit solchen Dingen nicht wirklich genau ist und ich kein langsameres Gerät habe. Ich kann auch nicht viele Details zu NSUserDefaults-Preformance-Berichten in der Dokumentation finden. Hat jemand Wissen zu dem Thema?

Ich überlege, Variablen in einem lokalen NSDictionary zu speichern, das ich in meiner .h definieren und dann nur NSUserDefaults während AppWillResignActive speichern und synchronisieren werde, aber ich sorge mich um Datenverlust im Falle eines Absturzes, Gerätebatterie stirbt, usw. Ich nehme an, ich könnte einen NSTimer haben und die Daten alle 5 Sekunden oder so speichern und auch appWillResignActive speichern, um den Verlust im Falle eines Absturzes zu minimieren. Ich würde es vorziehen, nicht große Mengen meines Codes neu schreiben zu müssen, obwohl NSUserDefaults auf kleineren Geräten gut umgehen kann.

+0

Beachten Sie, dass das Aufrufen von "Synchronisieren" nichts mit dem Schreiben der Daten auf die Festplatte zu tun hat. Es ist lediglich eine Synchronisierung mit einer anderen App, die den gleichen Standardspeicher liest und schreibt (das ist unglaublich selten, und für Nicht-Apple-Apps fast unmöglich, unter iOS zu verwenden). 'synchronize' wird bald (endlich) veraltet sein, weil es nichts mehr macht, was die Leute denken. Siehe den Artikel über die ordnungsgemäße Verwendung von NSUserDefaults von seinem Betreuer: http://dscoder.com/defaults.html –

+0

Danke @RobNapier Das war mir nicht bewusst! –

+0

Während ich den Antworten zustimme, nennst du 'synchronisiere' zu ​​viel atm, ich möchte darauf hinweisen, dass dein" Anliegen "wahrscheinlich unbegründet ist ... Wie viele deiner User haben eigentlich noch ein iPhone 4? [Dieser Link] (https://mixpanel.com/trends/#report/iphone_models/from_date:20,to_date:0) deutet darauf hin, dass der Marktanteil nur etwa 1% beträgt. Ich würde davon abraten, einen großen Teil Ihrer Zeit damit zu verbringen, für 1% zu optimieren. –

Antwort

3

Rufen Sie nicht 6 Mal pro Sekunde synchronisieren. (Führen Sie 6-mal pro Sekunde keinen plattenbasierten Vorgang aus.) Das System speichert die Benutzereinstellungen für Sie. Wie du sagst, ist das Aufrufen der Synchronisation in appWillResignAktiv sinnvoll oder zwischen den Ebenen.

Wenn Sie abstürzen, ist mit einem gewissen Datenverlust zu rechnen. Eine gut geschriebene App sollte jedoch nicht abstürzen. Wenn Sie mit einer Regelmäßigkeit abstürzen, ist das Ihr Problem, nicht die Benutzerstandards zu synchronisieren. (nicht zu sagen, Ihre App tut das)

+0

Hört sich gut an, also werde ich einfach nur auf NSUserDefaults speichern und jede Minute oder so auf einen Timer synchronisieren und auch auf appWillResignAktiv –

+1

@Albertrenshaw Es gibt keinen Grund, jede Minute "Synchronisieren" aufzurufen, außer du erwartest, dass deine App regelmäßig abstürzt . – rmaddy

+0

@rmaddy Ich erwarte nicht, dass meine App jemals abstürzt;) Aber ich denke, es ist besser als Nachsicht –

2

NSUserDefaults ist nur ein NSDictionary im Speicher. Solange Sie nicht jedes Mal, wenn Sie einen Wert festlegen, synchronize nicht unnötig anrufen, haben Sie kein Problem. Das Betriebssystem behält die speicherinterne Repräsentation hin und wieder bei. Sicher nicht mehrmals pro Sekunde.

Verwenden Sie also NSUserDefaults so oft Sie wollen. Rufen Sie synchronize nur zu seltenen Zeiten an, wenn Ihre App inaktiv wird oder in den Hintergrund tritt.

+0

Ich rufe jedes Mal an, wenn ich eine Variable speichere, haha, ich werde damit aufhören - danke! –