I don't think the model and the view can get desynchronised. let me try to convince you ;)

There are three kinds of nodes: EvaluatedNode (possibly contains children), EvaluatingNode (temporary leaf) and LeafNode (leaf, used if we know that a type contains no subtypes).

When an EvaluatedNode is expanded for the first time (through getChildren) it will invoke findInBackground and return a EvaluatingNode immediately. findInBackground schedules a new Job that looks for the subtypes. When it has found all the subtypes (i.e. it isn't incremental yet) it updates the cache and invokes refresh on the viewer (on the UI thread); it's this extra call to refresh I believe makes sure it will never get desynchronised.

Even if you expand multiple nodes quickly and start many simultaneous jobs the last job to finish will still invoke refresh which redraws the entire view, thus synchronising the view with the model :) Convinced?