2010-06-07 10 views
3

Je travaille sur ce problème depuis un moment et je suis ouvert à toutes les bonnes pratiques/conseils.Données de base et performances médiocres

L'exemple

Je créé un exemple d'application de base de données. L'application est essentiellement un imitateur de l'application AddressBook. J'ai les entités suivantes: Groupe, contact, adresse, téléphone, email, page Web, dates.

Comme vous l'avez probablement deviné, un groupe peut avoir plusieurs contacts et un contact peut être dans plusieurs groupes. Les contacts peuvent également avoir plusieurs adresses, téléphones, e-mails, pages Web et dates.

J'ai fondamentalement importé quelque 600 contacts dans cette application depuis AddressBook. L'interface utilisateur est relativement simple ... une liste Groupe/catégorie sur la gauche et un NSCollectionView ou NSTableView sur la droite qui montre la liste des contacts en fonction du groupe sélectionné. (Vue de collection ou vue de table ... comme j'ai ajouté la possibilité d'afficher l'une ou l'autre des vues liées à un NSArrayController)

Les éléments du groupe que j'utilise par le biais du code, par opposition à Interface Builder, parce que je voulais contourner le problème avec une barre latérale similaire à celle de Thing. beaucoup plus facile de le faire de cette façon.

Le problème

L'une des catégories contient tous les contacts tandis que l'autre catégorie contient seulement 2 contacts. Lorsque je sélectionne la catégorie qui a tous les contacts, il faut de 8 à 10 secondes pour que les informations remplissent la collection ou la table. Cependant, faire la même chose dans AddressBook lui-même est très rapide, presque instantané. J'utilise le type de magasin SQLLite, et j'ai essayé d'utiliser un certain nombre d'approches différentes, y compris essayer de diagnostiquer le problème via Instruments, mais rien n'a fonctionné.

J'ai essayé de définir un prédicat sur defaultFetchPredicate du contrôleur de tableau de Contact, plutôt que de définir un prédicat de filtre, mais cela n'a pas fonctionné.

J'ai essayé de pré-charger et de faucher mais je ne suis pas sûr si je le fais correctement, et je ne sais pas vraiment comment l'accomplir si Interface Builder gère NSArrayController du contact.

L'Autre exemple

J'ai aussi essayé de télécharger un échantillon application de base de données ... alors qu'il a un modèle de relation plus simple que ce que je faisais (essentiellement une molécule a des objets Atom et un objet Atom a Objets élément), j'ai inséré 65 000 disques et il s'est comporté comme un charme.

La question

J'ai essentiellement frappé un mur et je me demande si quelqu'un d'autre sait pourquoi cela se passe et les meilleures façons de résoudre/surmonter/éviter ce type de problème?

Merci!

+0

Peut-être sélectionner les éléments liés en morceaux de 10 ou 20 et continuer à les async en arrière-plan, après les 10-20 premiers sont affichés. – Nate

+1

Faites-vous des amis avec Instruments.app. Comme pour toutes les questions de performance, les réponses sont au mieux des suppositions jusqu'à ce que vous ayez des données de performance. Portez une attention particulière aux extractions de données de base, aux échecs de cache et, peut-être, aux allocations globales d'objets. –

+0

J'ai remarqué qu'il y avait beaucoup plus d'extractions que je pense devrait se produire. Par exemple, lorsque l'application est lancée pour la première fois, il semble qu'elle récupère plusieurs fois l'objet Contact ... elle récupère littéralement 800 fois, mais il semble que le nombre de fetch soit seulement 1. Et ensuite, il récupère deux fois plus la quantité appropriée d'objets les deux fois. Très bizarre car je ne cours pas un tel code en boucle. – Patrick

Répondre

1

Il s'avère que c'était en réalité NSCollectionView qui ralentissait les choses. Je suppose que la création et la manipulation des vues x nombre de vues de vue de collection ajoute une quantité importante de frais généraux. IKImageBrowserView aurait pu être utilisé mais ce n'était pas ce que je cherchais.

J'ai fini par changer la disposition de l'application pour résoudre ce problème.

Merci à tous!

Questions connexes