2010-08-04 10 views
0

J'ai une question à propos des données de base. Au démarrage de mon application, quand mes données (qui sont stockées automatiquement par Core Data) sont-elles chargées dans les NSArrayControllers? Je veux le modifier en premier lieu avant que l'utilisateur puisse interagir avec lui. Pour être plus précis: j'ai un NSArrayController pour l'entité Playlist. Avant que l'utilisateur puisse ajouter de nouvelles listes de lecture ou interagir avec l'application, je souhaite modifier les listes de lecture par programmation. J'ai essayé windowControllerDidLoadNib: dans mon NSPersistentDocument (MyDocument.m) et awakeFromNib à la fois dans mon NSPersistendDocument et le NSArrayController, mais quand je vérifie dans ces méthodes avec [[myArrayController arrangedObjects] count] j'obtiens 0 comme résultat (le contenu du contrôleur de tableau est vide).Données de base: Quand et où les entités sont-elles chargées en premier lieu?

Cependant, j'ai effectivement des données stockées et il est affiché à l'utilisateur. Je ne sais pas quand et où je peux le modifier en premier lieu.

Merci pour votre aide.

Répondre

1

Les données ne sont jamais "chargées" dans NSArrayController. Le contrôleur de tableau n'est pas un tableau lui-même. Il ne contient pas ou ne stocke pas de données. Au lieu de cela, le contrôleur RAID interroge l'objet auquel il est lié pour des données spécifiques uniquement lorsque ces données spécifiques sont nécessaires. Cela est particulièrement vrai pour les données de base dans lesquelles les objets gérés ne sont entièrement instanciés qu'au moment de l'accès à leurs attributs. Le contrôleur de groupe déplace les données d'une structure de données de type tableau vers un autre objet (généralement un élément d'interface utilisateur.)

Si vous souhaitez modifier un magasin existant avant de l'afficher dans l'interface utilisateur, vous devez traiter les données avant le contrôleur de groupe. utilisé par l'interface utilisateur est même initialisé. Si vous utilisez NSPersistentDocument, vous pouvez remplacer readFromURL:ofType:error: pour récupérer et modifier tous vos objets lors de la première ouverture du document. Vous pouvez également remplacer les méthodes windowWillLoad ou showWindow du contrôleur de fenêtre. Quel que soit l'endroit où vous le faites, vous devez récupérer tous les objets gérés que vous souhaitez modifier. Vous pouvez créer par programme un contrôleur RAID pour cela, mais une requête d'extraction est plus facile à gérer si vous avez un grand nombre d'objets à modifier.

+0

Merci beaucoup! Je reconnais maintenant que j'ai besoin de récupérer les objets gérés que j'ai besoin de modifier au préalable. C'est exactement ce que je voulais savoir et ça marche maintenant pour moi! Merci. – Core

0

Vous pouvez essayer d'observer le keypath "arrangedObjects" du contrôleur et d'ajouter une logique pour que votre contrôleur RAID ait été rempli pour la première fois.

Un autre hook possible est l'implémentation des méthodes awakeFromInsert/awakeFromFetch de vos objets gérés.

Questions connexes