CoreData + Sortieren + D&D

  • CoreData + Sortieren + D&D

    Hallo,

    ein Problem, mit dem ich mich schon lange herumschlage und immer wieder durch "Frickelei" temporär löse:

    Man nehme eine Entität Kunde - die Kunden werden in einer TableView angezeigt. Der User soll durch Drag & Drop innerhalb der Tabelle die Reihenfolge der Kunden in der TableView ändern können. Die Reihenfolge soll nach einem Neustart der Anwendung erhalten bleiben. Klickt der User auf eine der TableViewColumns um den Inhalt der TableView anders zu sortieren, so soll dies ebenfalls möglich sein und diese Information soll nach einem Neustart der Anwendung ebenfalls nicht verloren gehen.

    Puh - ganz schön viele Anforderungen :(

    Meine bisherigen Ansätze: Jeder Kunde hat ein Attribut (ich nenne es meist index) vom Typ Int. Wird ein neuer Kunde erzeugt schaut er in seiner awakeFromInsert Methode nach dem größten bisher vergebenen Index - addiert dazu 1 und tada - dies ist der Index für den neuen Kunden. Beim Ändern der Reihenfolde durch D&D muss man allerdings den Index aller Kunden ändern: diese Lösung skaliert schlecht, wobei ich Tests mit 10.000 Kunden gemacht habe und keine Verzögerung feststellen konnte.

    Nachteil: Angenommen es gibt noch eine Entität "Firma", die viele Kunden hat und man möchte nun die Kunden zweier Firmen in der TableView anzeigen: dann stimmen die Indexes nicht.

    Aus diesem Grunde scheint mir das eine unglückliche Lösung zu sein.

    Da muss es doch was intelligentes geben - oder?
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • RE: CoreData + Sortieren + D&D

    Grundsätzlich machst du das richtig. Wenn du eine User-definierte Reihenfolge haben willst, musst du die speichern. Daran kann kein Weg vorbeiführen, weil du nicht "errechnen" kannst, was der User will. Apple hat leider immer noch nicht [NSKristallKugel kristallKugelWithUserProfile:profile] implementiert. ;)

    Aber das Umsortieren ist unnötig:
    Wenn der User auf eine Spalte klickt, sollte vom System nach dieser Spalte sortiert werden, also die Sortierreihenfolge geändert werden. Wird irgendwie die Sortierung wieder ausgeschalten (was das UI von Table-Views selbst nicht zulässt!), dann nimmst du eben wieder deine Index-Sortierung.

    Zusammenfügen:
    Das Problem liegt hier wieder in der Problemstellung, nicht in der Programmierei. Du kannst dann schlicht nicht wissen, welche Sortierung der User will. Nachvollziehbar für den Nutzer ist wohl nur, dass die Sortierung innerhalb der Firma gleich bleibt und die Firmen nacheinander gelistet sind. Hierzu kannst du Nummernkreise bilden, die du "on the fly" erzeugst. Also: Auch jede Firma bekommt einen Index und dann wird der Sortierindex aus kunde.nummer + kunde.firma.nummer * 10000 erzeugt. Auch nicht schön. Aber ich denke, du solltest dir erst einmal über das Verhalten deines Programmes klar werden. Da scheint mir das Problem zu liegen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?