Refresh CoreData Object dans une UIView

Bonjour a tous !



Je suis confronté a un souci de rafraichissement de donnée dans une simple UIView.



je m'explique.



j'ai une UITableView avec une liste d'entrée classé par sections "type".



Les sections "types" sont une liste d'entrée crée par l'utilisateur dans une entité dédiée.



J'ai eu un peu de mal a ce que cela fonctionne correctement avec les section et les row changeants a chaque slide de la view, mais j'y suis parvenu.



Au didSelectRow d'une des cell de la tableView j'envois l'object a la vue de description de l'entrée.

de cette maniere : ObjectEntitee *objectTransmit = [sortListEntitee objectAtIndex:indexPath.row];

jusque là  rien de tres compliqué.



Cependant dans la seconde vue j'ai intégré un control action sheet qui m'envois sur une vue QuickDialog pour modifier les informations de l'entrée.



Apres avoir sauvegardé mes informations je dismiss la modalVIew et je reviens sur la vue qui m'affiche la description.



Mon problème est donc de rafraichir les données sur cette vue. Sur la TableView j'ai pas de souci avec ca grâce a ReloadData mais la je ne sais pas trop comment my prendre.



J'ai éventuellement pensé à  recharger l'object via la liste mais il faut que je recupere l'id de l'entrée cette solution peut vite être maladroite je pense.



j'ai aussi regarder du coté de refreshObject:mergeChange mais je n'obtiens pas ce que je cherche grâce a ca.





J'aurais aimé quelques conseils.



Merci de votre attention !

Réponses

  • Entre ta vue et ton QuickDialog ce sont des context core data différents ?
  • Non.



    j'ai un seul contexte avec toutes mes entitées dedans. j'ai fais un singleton pour le baladé de vue en vue.



    Mais la je le passe carrément a la vue de quickdialog donc ca devrait aller.

    Mon problème est au retour, quand je reviens sur la vue qui appelle quick dialog apres avoir reussis a mettre a jour

    je suis encore sur les anciennes valeurs.



    Quand je redémare l'app mes données sont a jour.
  • Ben tu fais exactement comme lorsque ta vue affiche les infos lors de son premier chargement : tu mets à  jour ton interface.
  • MuskvkMuskvk Membre
    août 2012 modifié #5
    la vue recupère un object Albulm par exemple

    envoyé par une UITableView.



    la vue affiche les données.



    Si je veux modifier les données de cet album j'envoi l'objet a QuickDialog qui lui me fait une jolie vue pour pouvoir les édités.

    je mets a jours jusque la pas de souci, ensuite je dismiss la modal et j'ai toujours les anciennes données.



    par contre si je retourne a la UITableView qui elle a reloadData et que je didSelect la sur la vue de description j'aurai les nouvelles données.



    je ne sais pas comment mettre a jour les données en sens inverse en fait, dans mon didSelectRow

    je fais un objectAtIndex et je mets tout dans l'objet que je passe a la vue de description.



    Mais je sais pas comment my prendre pour ré-interroger CoreData pour avoir les données a jour.



    C'est peut être tout con et je cherche peut être midi a quatorze heure mais la, je vois toujours pas ^^



    Désolé si je sui un peu lourd pour le coup la :/
  • je pense que je vais aller faire une fonction qui me sort la ligne du tableau sur la quelle je didSelect.

    je ne passerai que l'integer a la vue de description qui elle rechargera la la l'entité CoreData dans le viewDidLoad





    Ca me permettra de toujours avoir les données a jour.



    Par contre je trouve ca un peu maladroit. Qu'en pensez vous ?



    Ca ne fait pas un peu trop de chargement au niveau de l'entité chargée 2 fois, mais au moins quand je reviens dessus je suis a jour.



    Pour le moment je ne vois absolument rien d'autre ... Si vous avez des idées ca serait cool.



    Merci
  • Tu te compliques la vie pour pas grand chose j'ai l'impression.



    Je ne comprends pas ce qui te gêne pour mettre à  jour ta vue. Lorsque ton QuickDialog se ferme, il suffit de relire les propriétés de ton objet album et de mettre à  jour ton interface.
  • Je suis de l'avis de Kubernan. Relis to MO et c'est fini.



    Il ne faut pas oublier que CoreData c'est des objets en mémoire, lorsque tu les modifies, tu modifie les objets en mémoire. Donc toute code client d'un MOC commun accède aux modifications en temps réel.



    Le seul cas où on est obliger de recharger les données depuis le MOC c'est lorsqu'un save est fait et que du coup les MO existants sont invalidés.
  • MuskvkMuskvk Membre
    août 2012 modifié #9
    Justement quand je vais sur QuickDialog, jy vais pour modifier l'entrée, et je sauvegarde derriere.



    Sinon pour modifier les données souvent j'initialise l'objet que je passe de vue en vue. en le modifiant ou non mais là  je modifie / sauvegarde / dismiss le modal donc je croix que tu viens de repondre a ma question : je suis obligé e recharger les données.





    Donc mon idée de recharger la liste a l'index de la ligne vous en pensez quoi? C'est propre? ...
  • 'Muskvk' a écrit:


    Donc mon idée de recharger la liste a l'index de la ligne vous en pensez quoi? C'est propre? ...




    Transmettre à  ta vue l'index path d'une table view d'une autre vue pour récupérer un objet image/huh.gif' class='bbc_emoticon' alt='???' /> Pas propre non.



    Là , même, après un save ton objet est toujours là . Au pire tu refais un fetch dessus (avec l'objectID, c'est très rapide). Si par contre tu attends à  que ton interface se mette à  jour toute seule tu vas attendre longtemps.
  • Je suis en mode ARC l'objet est free automatiquement non ?

    Sinon suggestion ?



    Pour mettre a jour ma vue, je ne peux pas reloadData la vue donc a part recharger l'object je ne vois pas comment faire autrement que de charger l'object.



    En fait je n'envois pas l'indexPath.row a la vue j'envois l'index du tableau que j'envois dans l'object coredata pour pouvoir l'exploiter. Sinon je ne vois absolument rien pour faire ce dont j'ai besoin... faire un fetch est a peu pret la meme chose non ? parce que cas se fait dans un predicate nn ?



    Parce que dans mon cas l'object est déja en memoire j'ecrase juste les données en rechargeant les nouvelles mais je n'en realoue pas de nouveau surtout que je le déclare dans le .h .





    La, j'ai besoin de plus d'explication et désolé si je ne suis pas tres clair .... :$
  • Pour ARC, disons que si tu te poses ce genre de questions, je te suggère de faire sans ARC. Ca te permettra de mieux comprendre les mécanismes de gestion des objets en mémoire.



    Pourquoi tiens-tu à  travailler avec un index (d'où qu'il vienne) alors que tu as un objet sous la main ?



    Nous sommes d'accord que c'est ta vue détail qui n'est pas mise à  jour après avoir modifié les données de ton objet dans un autre controller ?



    Tu devrais ajouter dans ta vue détail une méthode du genre



    - (void)updateUserInterface {

    if (self.monAlbum != nil)

    self.descriptionLabel.text = self.monAlbum.description;

    }



    Tu appelles cette méthode depuis ton viewDidLoad par exemple.



    Dans ton controller d'édition de ton objet, tu fais ton mimac, tu save ton context et tu informe ta vue détail que des mises à  jour on été faite (via une méthode delegate). Par exemple :



    - (void)editAlbumDidSave { // methode (protocole) delegate à  implémenter dans la vue détail et appelé depuis la vue d'édition

    [self updateUserInterface];

    }



    Et c'est fini.
  • J'avais fais quelque chose comme ca mais pourtant ca ne passait pas.

    je vais re essayé mais je suis pas convaincu.





    J'espère qu'en reprenant tout depuis le debut ca passera parce que ca ne marche plus depuis que j'ai ajouté une vue qui s'occupe elle seule de mettre a jour.

    C'est bizare quand meme avant ca passait et la non.



    Peut être que le manque de pause ma fait aller dans le mauvais sens ... Mais là ... C'est uniquement avec cette vue.



    Le coup de l'index me semblait une maniere de pouvoir recharger le meme objet en écrasant les anciennes valeur, mais c'est pas propre.



    j'espère que ca passera correctement cette fois - ci je revendrai par ici, vous dire si et ou j'ai fais un erreur... :/
  • MuskvkMuskvk Membre
    août 2012 modifié #14
    Bon, je suis de retour un peu mécontent de moi.



    ca marchait depuis le debut, j'ai du faire des erreur au milieu en bricolant et du coup je suis aller sur une autre piste...



    Donc au final je n'alou qu'une seule fois mon object que je passe sur 3 vue au total.

    Par contre je renseigne mes .text dans le viewWillAppear dans le didLoad ca ne doit pas se mettre a jour vu que je slide une modalView donc au dismiss je ne dois pas la rechargée vraiment d'ou le delegate proposé il me semble.



    mais la dans le willAppear ca fonctionne serrait t'il mieux de faire quand meme un protocol ?





    Désolé d'être un peu pointilleux mais ces derniers temps j'aimerais améliorer ma qualité de code et de methode de developpement.

    savoir faire c'est bien mais bon proprement c'est mieux ...



    Merci pour ce post un peu lourd et désolé pour ma bétise ... :/
Connectez-vous ou Inscrivez-vous pour répondre.