Frage

Ich habe eine iPhone -App mit einem großen, verschachtelten NSArray von Saiten. Das NSArray geht 3 Stufen tief und es gibt insgesamt ungefähr 15.000 Saiten auf tiefsten Ebenen. Die überwiegende Mehrheit der Saiten hat weniger als 20 Zeichen. Von Zeit zu Zeit hängt meine App eine Weile und setzt dann nach 5 bis 25 Sekunden fort. Dies ist offensichtlich inakzeptabel. Wenn ich die App mit nur 2.000 Saiten betreibe, werden die Hänge viel seltener. Ich bin mir also ziemlich sicher, dass der große Nsarray das Problem verursacht.

Welche alternative Datenstruktur würde wahrscheinlich besser funktionieren? Alles was ich brauche ist, das Array schnell aus einer Datei zu lesen, wenn die App startet und dann zufällig aus dem Array zugreifen kann. [Es ist tatsächlich etwas komplizierter als das; Ich muss in der Lage sein, zufällige Zeichenfolgen aus vorbestimmten Teilmengen des Arrays zu holen.] Das Programm könnte eine zufällige Zeichenfolge so oft wie einmal pro Sekunde holen.

Übrigens wird der NSArray derzeit in einer Singleton -Klasse aufbewahrt.

War es hilfreich?

Lösung

Während andere Datenstrukturen (TRIE) in den Sinn kommen, sind die wirklichen Fragen:

(1) Haben Sie oder können Sie während dieser Hänge mit Instrumenten profilieren

und mit der nicht notwendig korrekten Annahme, dass die Arrays Ihr Problem sind

(2) Welche Operationen führen Sie in den Arrays aus?

Sie möchten nicht erraten, was Leistungsprobleme verursacht, es sei denn, Sie haben keine andere Wahl, möchten Sie messen. Aber wenn Sie mich vermuten lassen, würde ich mich fragen, ob Sie fest im Speicher laufen, und ob das System das System mit geringer Speicherwarnungen und Dingen aufräumt.

Andere Tipps

Bei so vielen Saiten gibt es keine Möglichkeit, sie gleichzeitig in einem Tisch zu haben (oder ???).

Sie müssen diese wirklich in eine Datenbank einfügen und auf darauf zugreifen. Kerndaten werden zugeschnitten, um große Objektdiagramme zu behalten und die Teile, die Ihnen wichtig sind, schnell herauszuziehen, während sie die Dinge hinter den Kulissen für Sie zwischengespeichert.

In Bezug auf Instrumente möchten Sie wirklich Zeitprofiler verwenden, um zu erkennen, wo das System seine ganze Zeit verbringt - vorzugsweise auf dem Gerät selbst. Möglicherweise sind Sie in Autorelease -Objekten viel Zeit aufgewendet, beispielsweise (die die lange zufällige Pause zu sein scheint) - das würde dem ständig großen Teil der Arrays entsprechen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top