Comment mettre des dispatch_queue_t dans un NSDictionary ?

colas_colas_ Membre
juin 2014 modifié dans Objective-C, Swift, C, C++ #1

target : 10.7


 


 


Bonjour,


je souhaite créer une dispatch_queue par dossier exploré.


 


Plus précisément, mon programme a besoin de faire des tâches pour différents dossiers et je voudrais qu'il crée une dispatch_queue pour chaque dossier.  Si plus tard (ou parallèlement) il est rappelé et qu'il doit être exécuté sur le même dossier, il doit utiliser la même queue.


 


Mon problème est que dispatch_queue_t n'est pas un objet (du moins sur osx10.7). En effet, j'aurais par exemple voulu garder ces infos dans un NSDictionary qui à  un URL aurait renvoyé une dispatch_queue.


 


Voyez-vous d'autres façons de faire cela ?


 


Merci


 


EDIT : j'ai pensé utiliser les labels mais la doc d'Apple me laisse penser qu'on ne peut pas récupérer une dispatch_queue par son label.


Réponses

  • CéroceCéroce Membre, Modérateur
    Crée une classe Dossier. Les dicos, c'est pratique, mais ça a ses limites.
    Par ailleurs, je ne suis pas certain qu'il soit nécessaire de créer autant de queues.
  • AliGatorAliGator Membre, Modérateur
    Pareil.

    1) Tu peux utiliser NSOperationQueue qui finalement peut être vu comme l'équivalent Objet de dispatch_queue (bon c'est tjs pas tout à  fait équivalent en pratique mais sur les grands principes si)

    2) Mais d'un autre côté autant créer des classes métier qui vont organiser ton code plus proprement qu'un NSDictionary un peu abstrait, et pour lesquelles tu pourras du coup mettre une propriété dispatch_queue

    3) Il me semble que les dispatch_queue_t sont des OS_OBJECTS (c'est à  dire certes des objets C et pas ObjC, mais qui sont faits tels qu'ils peuvent être correctement gérés par ObjC et tout, cf le flag OS_OBJECT_USE_OBJC) et du coup je me demande si " à  condition sans doute de les caster en (id) " tu ne peux pas les mettre dans un dictionnaire

    4) Comme Céroce, je ne suis pas certain que créer autant de queue soit une bonne idée.

    Pourquoi ne pas utiliser une queue parallèle et empiler dessus autant de blocks que tu as de traitement à  faire sur chacun de tes différents dossiers ? Une contrainte particulière ?

    Par exemple une NSOperationQueue* folderProcessings et pour chaque dossier à  traiter tu fais une NSOperation par traitement, que tu enqueue sur ta folderProcessings ? A moins que pour chaque dossier lui-même tu aies déjà  aussi des sous-opérations, etc ?
  • colas_colas_ Membre
    juin 2014 modifié #4

    Bonne idée pour une classe dédiée, oui (c'est ce que j'ai fait) :



    @interface MyCBDQueueForAFolder : NSObject

    @property (readwrite, strong, nonatomic) __attribute__((NSObject)) dispatch_queue_t queue;

    @end



    @implementation MyCBDQueueForAFolder

    - (instancetype)init
    {
    self = [super init];
    if (self)
    {
    dispatch_queue_t queue = dispatch_queue_create("compressing PDFs", DISPATCH_QUEUE_SERIAL);
    dispatch_retain(queue) ;
    _queue = queue ;
    }
    return self;
    }


    - (void)dealloc
    {
    dispatch_release(_queue) ;
    }

    @end


    Les NSOperationQueue seraient sûrement la meilleure idée (genre une NSOperation parallèle, et je limiterais à  5 dossiers à  la fois). Pour l'instant, j'ai fait l'impasse sur les NSOperation et je fais tout en GCD.


     


    Oui, ça fait beaucoup de queue par dossier. Il faut je traite peut-être 100-200 dossiers. Je pensais que GCD allait tout bien traiter tout seul et mettre des queue en attente. Est-ce le cas ?


     


    EDIT @Aligator : ce sont des objets à  partir de osx 10.8


     


    EDIT2 : L'algo tourne avec 300 dossiers. Il semble que le système gère le dispatch des queues. Au cas où, je suis toujours preneur d'un bout de code NSOperation. J'étais allé voir la doc il y a quelques mois et j'en avais conclu : GCD.


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