[Resolu] Sorting d'une array de dictionnaire

GeoffreyGeoffrey Membre
janvier 2015 modifié dans API UIKit #1

Hello,


 


Je ne sais pas si c'est faisable facilement. J'ai une NSMutableArray arrayOfOperation de NSDictionary.


 


Le dictionnaire a cette forme :


"date" : NSDate


"operations" : NSArray d'un objet Operation


 


Est ce que je peux trier l'arrayOfOperation en fonction de la clef date des dictionnaires ?


Réponses

  • AliGatorAliGator Membre, Modérateur
    C'est à  ça que sert NSSortDescriptor qui te permet d'indiquer la "clé" selon laquelle tu veux trier tes objets de ton tableau.


    La méthode dédiée de NSArray doit s'appeler un truc comme "sortedArrayUsingDescriptors:", ou si c'est un NSMutableArray "sortUsingDescriptors:". Tu lui passes un tableau de NSSortDescriptors mais dans la majorité des cas c'est un tableau avec un seul NSSortDescriptor dedans.
  • GeoffreyGeoffrey Membre
    janvier 2015 modifié #4

    Tain c'est magique ce truc oO  


     


                       



    // Reorder the array of operations (otherwise date aren't correctly ordered)
    NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:kOperationArrayDateKey ascending:NO];
    NSArray *bufferArray = [[ApplicationData sharedInstance].arrayOfPFMPRCAllOperations sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];
    [ApplicationData sharedInstance].arrayOfPFMPRCAllOperations = [NSMutableArray arrayWithArray:bufferArray];

  • Je ferais juste un commentaire sur l'utilisation de singleton dans ton cas.


     


    ApplicationData, le nom indique que c'est une classe qui gère des données et c'est un singleton en plus. Généralement l'état global mutable est déconseillé et surtout dans le cas d'un singleton. Dans ton cas n'importe quel objet peut ordonner les opérations à  sa façon et comme Objective C supporte "l'aliasing" ben c'est le mal absolu.

  • Théoriquement il n'y a pas d'utilisation concurrente mais oui, c'est vrai que c'est pas super propre.


  • la concurrent c'est un autre problème :).


     


    La c'est juste la mutabilité de la classe qui est accessible par tous les autres objets puisque c'est un singleton même si tout se passe dans le même contexte ( le même thread). 


     


    C'est un peu ce que encourage la logique de  Swift avec les structures,...

  • Et si je souhaite que l'array puisse être muté par différents objets ?


  • EnkiduEnkidu Membre
    janvier 2015 modifié #9

    Je passerais une copie de array a chaque classe (objet) et il fera ce qui veut de cette array.


     


    Le problème de singleton est que c'est la même référence par tout, donc ta liste d'opération est la même aussi, et avec l'aliasing tu peux te retrouver avec plusieurs objets qui référencent la même instance de liste qui est mutable facilement et partout. Ensuite imagine que ObjetA veut la trier d'une manière ascendante et l'objetB d'une manière descendante ..... ça va surement crée des bugs.


  • Oui, après la liste ne doit être trier que d'une seule façon à  chaque fois.


     


    Si j'ai le temps je changerais en un array non mutable mais la me reste trop de taf !


  • AliGatorAliGator Membre, Modérateur
    à‰viter les classes mutables exposées publiquement dans des contextes type singleton ou concurrentes.
  • Ok donc la solution c'est que j'utilise des NSArray, et quand j'en ai besoin j'utilise des NSMutableArray, je travaille dessus et à  la fin je change le NSArray du singleton ?


Connectez-vous ou Inscrivez-vous pour répondre.