2017-01-19 10 views
0

Ich habe ein Kerndatenmodell enthält drei Entitäten (ohne Vererbung).Core Data Performance-Problem

Management 
Team Leader 
worker 

Die Beziehung zwischen den Entitäten: Für unter jedem Manager kann mehr Manager, Teamleiter und Arbeiter sein. Für unter jedem Teammanager können andere Arbeiter sein.

Das Modell ist insgesamt mehr als 100.000 Objekte enthalten.

Alle Daten repräsentieren durch NSOutlineView, zum Beispiel:

*Management 
-Management 
    -Management 
    -Team Leader 
     -worker 
     -worker 
     -worker 
    -Management 
     -worker 
     -worker 
    -Management 
    -worker 
    -worker 
    -worker 
*Management 
    -Team Leader 
     -worker 
     -worker 
    -Team Leader 
*Management 
    -Team Leader 
     -worker 
     -worker 

Der Benutzer durch Eingabe von Text (Token) auf einem Textfeld die Gliederungsansicht filtern.

Für jede Gruppe von Tokens suche ich im Kerndatenmodell, ob die Entität oder alle Beziehungsentitäten alle Token enthalten und wenn die Antwort wahr ist, wird die Entität in der Gliederungsansicht und allen ihren Vorfahren für darstellen Beispiel, wenn nur zwei Arbeiter alle Token enthalten, wird der Benutzer sehen (für beide der workes, zum nächsten gemeinsamen Vorfahren der dritte Manager ist, und zum ersten Arbeiter Teamleiter auch ist):

Management 
-Management 
    -Management 
    -Team Leader 
     -<worker> 
    -<worker> 

So Im Grunde ist meine Datenstruktur ein Baum, und der intuitivste Weg (für mich) zu suchen ist ein rekursiver Algorithmus (ich habe es mit DFS gemacht).

(Wenn ich richtig verstehe, gibt es keine Möglichkeit, rekursiv mit NSPredicate zu suchen.)

Also, für jede Gruppe von Token (I verwenden, um Drosselung Redundanzen zu vermeiden suchen, während der Benutzer eingeben). Ich passe durch die Top-Manager (die Manager an der Spitze) und durch alle ihre Beziehungen Entitäten (Sub-Management, Team Leadera und Arbeiter).

Diese Suche dauert sehr lange. IMHO das Hauptproblem ist, dass ich alle Entitäten die ganze Zeit durchlaufe, und ich kann die Leistung mit Indexierung nicht verbessern, weil ich keine Abfrage verwende, gehe ich einfach durch alle Objekte und lade sie in den Speicher, und Ich erlebe das Leistungsproblem hauptsächlich in früheren Abfragen vor den Objekten im Speicher.

Irgendwelche Ratschläge, wie man die Leistung verbessert?

Antwort

0

Warum suchen Sie rekursiv?

ich es auf diese Weise tun würde:

  • nur die Suche in allen drei Einheiten eine pro Zeit mit NSPredicate:
    • Sie erhalten 3 Ergebnisse.
  • dieser drei Ergebnis Ihr Ergebnis Baum bauen:
    • für jeden Treffer append auch die Breadcrumps bis zur Wurzel in den Ergebnisbaum