2010-03-30 23 views
0

J'ai un grand ensemble de données (environ 3500 objets) qui retourne d'un serveur distant via HTTP. Actuellement, les données sont présentées dans un NSCollectionView. Un aspect des données est un chemin d'accès au serveur pour une petite image qui représente les données (pensez à la vignette pour plus de simplicité).La liaison Valueurl sur les grands tableaux provoque une interface utilisateur léthargique

Les liaisons fonctionnent de manière fantastique pour les données déjà renvoyées, et la liaison de l'image via une liaison valueurl est facile à faire. Cependant, l'interface utilisateur est très lente lors du défilement de l'ensemble de données - ce qui me fait penser que le NSCollectionView récupère toutes les données d'image au lieu de seulement les données d'image utilisées pour afficher les images actuellement visibles. J'ai eu l'impression que les contrôles Cocoa étaient assez intelligents pour récupérer uniquement les données pour les informations qui sont en cours de sortie vers l'interface utilisateur par chargement paresseux. Cela semble certainement être le cas avec NSTableView - mais je pourrais être égaré sur cette pensée.

La liaison valueurl doit-elle agir paresseusement et, de plus, doit-elle agir paresseusement dans un NSCollectionView?

Je pourrais créer un mécanisme de mise en cache (en fait je l'ai déjà mis en place pour une autre application - voir mon article ici si vous êtes intéressé Populating NSImage with data from an asynchronous NSURLConnection) mais je ne veux vraiment pas suivre cette voie Je dois le faire pour cette implémentation spécifique, car l'utilisateur pourrait potentiellement modifier des ensembles de données souvent et ne souhaiterait que de petits sous-ensembles de données.

Des approches suggérées?

Merci!

Mise à jour

Après un peu plus de tester, il semble que le problème se pose parce qu'une action de défilement à travers l'ensemble de données provoque chaque image à demander à partir du serveur. Une fois que toutes les images ont été passées dans l'ensemble de données, la réponse est très rapide.

Alors, question ... est-il possible de désactiver la récupération valueur lors du défilement et de la réactiver lorsque le défilement est terminé?

Répondre

0

Ma solution consiste à utiliser un mécanisme de mise en cache personnalisé comme celui que j'utilise déjà pour une autre application. Le problème se manifeste car lorsque vous faites défiler des images qui n'ont pas encore été téléchargées, le contrôle se déclenche lui-même pour aller chercher les fichiers non encore téléchargés. Une fois téléchargées, les images sont disponibles localement et la vitesse de défilement se normalise donc. La solution consiste à vérifier si l'image est disponible localement et à présenter un autre graphique d'ensemble d'applications pendant le téléchargement de l'image en arrière-plan. Une fois l'image téléchargée, mettez à jour le modèle avec l'image remplaçant l'image de talon provenant de l'ensemble.

Cela laisse l'interface utilisateur dans un état très réactif tout au long, laisse l'utilisateur avec la possibilité d'interagir et permet une gestion de fond personnalisée des images.

Bien sûr, ça aurait été bien si Cocoa avait tout ça pour moi, mais que ferais-je à faire? :-)