2009-05-28 9 views
3

Quelle est la meilleure façon de savoir quand mon contrôleur de tableau lié à mon magasin de données principal a fini de charger son contenu? J'ai certaines méthodes (c'est-à-dire awakeFromNib) qui reposent sur le contenu du contrôleur RAID, mais la plupart du temps, le contrôleur RAID n'a pas encore son contenu lorsque awakeFromNib est appelé sur cet objet.Quelle est la bonne façon de dire quand un NSArrayController a fini de charger son contenu à partir d'un magasin persistant?

Je veux retarder mes actions jusqu'à ce que je sache que le contrôleur a tout son contenu.

Répondre

3

Déplacement ce code à -windowDidLoad est généralement une valeur sûre, il est appelé après la fenêtre est complètement chargée par rapport à -awakeFromNib où vous pouvez potentiellement rencontrer des problèmes parce que l'ordre sur lequel il est appelé tous les objets de votre plume n'est pas défini.

En général, il est recommandé de noter mentalement toutes les initialisations que vous effectuez, quelles parties nécessitent une interface utilisateur pour fonctionner correctement, quelles parties peuvent être différées jusqu'à ce que l'utilisateur effectue une action, etc. Par exemple, il est bon de retarder des tâches telles que l'exécution d'une extraction de données de base jusqu'à la dernière minute, au cas où vous auriez une fenêtre qui n'est pas ouverte jusqu'à ce que l'utilisateur la demande. D'un autre côté, vous allez parfois travailler avec un objet comme une vue en plan dont la source de données doit être pré-remplie pour que les méthodes de persistance fonctionnent. Une fois que vous savez ce que vous faites et dans quel ordre cela doit être fait, vous pouvez choisir une combinaison d'init, awakeFromNib, yyyWillLoad, ou xxxDidLoad et vous vous occuperez de beaucoup de bugs comme ça avant ils ont une chance de causer des problèmes.

+1

@ctshryock: vous devriez vraiment considérer cette réponse. Mon post est seulement une réponse à votre question. Cependant, cette réponse décrit ce que vous devez faire dans une application réelle. – cocoafan

+0

conseils pris, merci à vous deux! – catsby

1

Voir Theocacao pour une discussion sur ce problème

+0

Je ne suis pas d'accord avec l'utilisation de messages différés, juste parce qu'il y a habituellement un meilleur endroit pour mettre cette logique (et pour les raisons discutées dans les commentaires de cet article). –

+1

en fait, j'ai regardé ici les avis de KVO pour NSArrayController (http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaBindings/Articles/ControllerKey-ValueObservingCompliance.html#//apple_ref/doc/uid/TP40002493-DontLinkElementID_3). En ajoutant des observateurs à plusieurs pour voir le timing, il semble que le "contenu" soit déclenché quand il est chargé depuis le magasin – catsby

Questions connexes