NSOutlineView mit NSTreeController - Beachball bei Option-Expand mit großen Baum vermeiden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSOutlineView mit NSTreeController - Beachball bei Option-Expand mit großen Baum vermeiden

    (Verdammt - sollte besser im ObjC/Cocoa-Bereich und nicht bei Xcode landen - kann das jmd. bitte verschieben?)

    (Vorgeschichte: NSBrowser, NSTreeController und NSTreeNode: Der Rateweg zum Ziel...)

    Stellt euch vor, ich bilde das gesamte Dateisystem mit > 1 Mio Items über einen OutlineView ab. Dabei sind die vom NSTreeController benutzen TreeNodes-Objekte, die jew. einen Folder oder File abbilden, "lazy loading", d.h. erst wenn deren Children-Property abgefragt wird, werden die Directory-Inhalte von Disk gelesen und im TreeNode gecacht und dann zurückgeben. D.h, das kann etwas dauern.

    Solange der User nur einzelne Ordner aufklappt, geht das.

    Aber wenn der User einen Option-Klick auf den Root-Node macht, wird der NSTreeController korrekterweise alle Nodes "deep" öffnen. Mal abgesehen davon, dass das viel Speicher braucht, führt das aber v.A. zu einem Einfrieren der App.

    Ich könnte das nun so lösen, daß die Children-Property dann erstmal ein leeres Array liefert, dann die Daten im Background geholt werden und schließlich über KVO die Children-Prop aktualisiert wird, was ein erneutes Refresh des Nodes beim NSTreeController triggert.

    Allerdings will der NSTreeController ja so viele Nodes auf einmal öffnen, daß der da praktisch keine Pause einlegt und somit weiterhin die App den Beachball zeigt.

    Hat da jmd. vielleicht ne elegantere Lösung? Ich scheine ja nichtmal in der Lage zu sein, den Option-Expand zu verhindern, wenn ich NSTreeController verwende, oder? Wenn ich diese Aktion z.B. künstlich verzögern könnte, dann könnte ich dadurch Pausen erzeugen, in denen das UI responsive bliebe, auch wenn es weiterhin langsam alles aufklappt. Oder muss ich dazu dann alles selbst machen, muss also NSTreeController aufgeben?

    Wer weiß, ob man sich da in die Aktionen von NSTreeController reinhängen kann?
    Apps: apps.tempel.org (Find Any File, iBored, iClip, Prefs Editor)
    Blog: http://blog.tempel.org
    Über mich: tempel.org/AboutThomasTempelmann