[Conception] Un thread charge en fond...
Bonjour,
Je souhaiterais vous demander votre avis sur la conception suivante:
Je suis en train de créer un menu RSS.
Les feed RSS sont donc chargés en arrière plan dans un thread secondaire.
Le thread principal de l'utilisateur permet de naviguer dans l'arbre des feeds.
Il y a donc des données critiques entre les deux threads.
Je ne veux toujours pas utiliser les nslock ni duppliquer les données pour le second thread.
Alors ce que j'ai fait c'est que le second thread charge le feed et au dernier moment envoie un performSelectorOnMainThread: qui contient le minimum de code servant à mettre à jour les données critiques (qui ne le sont plus du coup).
Dès point de vue "professionnel" est-ce propre ?
Merci.
Je souhaiterais vous demander votre avis sur la conception suivante:
Je suis en train de créer un menu RSS.
Les feed RSS sont donc chargés en arrière plan dans un thread secondaire.
Le thread principal de l'utilisateur permet de naviguer dans l'arbre des feeds.
Il y a donc des données critiques entre les deux threads.
Je ne veux toujours pas utiliser les nslock ni duppliquer les données pour le second thread.
Alors ce que j'ai fait c'est que le second thread charge le feed et au dernier moment envoie un performSelectorOnMainThread: qui contient le minimum de code servant à mettre à jour les données critiques (qui ne le sont plus du coup).
Dès point de vue "professionnel" est-ce propre ?
Merci.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
C'est précisément fait pour ça !!
Je viens de rechercher "Critical Section" dans la doc Apple, et de découvrir l'existence de @synchronized qui semble répondre justement à ton besoin
Il bloque tous les accès à self quand deux threads rentrent en même temps dans le @synchronized(self) (nslock normal) (ce qui n'est pas mon cas) ou lorsqu'un thread rentre dans le @synchronized(self) aucun autre thread ne peux utiliser l'instance self tant que le thread n'est pas sorti du @synchronized() (et la c'est mon cas en effet).
J'ai dis quelque chose de trop ou une j'ai une mauvaise lecture de l'anglais ??
Je ne comprends pas comment fonctionne exactement le @synchronized(self) ?
Chacha pourrait certainement t'en dire plus vu qu'apparament il a déjà utilisé NSLock, @synchronized et ses confrères (là et là ).
Mais sinon j'ai pas non plus trop compris l'utilisation de "self" avec @synchronized. Enfin si,j'ai compris, tu te sers de "self" comme d'un mutex, mais je trouve que c'est le meilleur moyen de se gourrer et de faire des confusions...
Moi j'utiliserai plutôt un objet dédié qui servira de sémaphore (dans ton cas, d'un mutex), comme dans l'exemple mis ici.
Donc tu te crées un objet (un sémaphore) nommé par ex "mutex" et tu places tes sections critiques dans un @syncronized(mutex), même mutex pour tes 2 threads. Comme ça Cocoa fera en sorte que tes 2 threads ne puissent jamais être dans une section critique ayant le même mutex en même temps (si un des threads est dans un bloc critique, l'autre attendra avant d'y rentrer)
- Un NSLock c'est plutôt pour protéger une ressource
- Une section critique c'est tout une partie de code qui ne devrait être executée que par un thread à la fois.
Mais il se trouve que les sections critiques sont souvent implémentées par des NSLocks.
Donc en fait fondamentalement c'est la même chose que les NSLocks, c'est juste une façon plus propre/simple/... Si jamais t'as pas encore lu ce doc, ça pourra peut-être t'éclaircir les idées.
En gros utiliser @synchronized ou utiliser des NSLocks au final ça ne doit rien changer, c'est juste que @synchronized semble dédié aux sections critiques.
Et oui donc retour au point de départ on sait juste que @synchronized() existe et qu'en gros qu'il n'apporte rien si ce n'est un gros tas de nouilles... Plus propre en quoi ? On ne sait pas ce qu'il fait ?!
C'est aussi une question que je me pose...:P
Mais comme apparemment ça n'apporte pas d'avantage certain, je suis plus partisan de NSLock.
Pourquoi ne veux tu pas utiliser cette classe ? ???