im un peu confus ici, im en files d'attente et je suis arrivé à un point où je suis un peu perdu.
J'ai une méthode nommée Le code précédent est exécuté chaque fois que l'utilisateur tapote un bouton. Quelque chose comme "Donnez-moi des photos de cet album" et ensuite un autre Tap "Maintenant, je veux les images de gens de cet autre album", des photos différentes et une quantité différente de photos. Si l'utilisateur tapote assez rapidement les boutons, la première file d'attente ne finit pas la récupération des données lorsque la seconde commence déjà. Avec dans Ce que je ne peux pas comprendre, c'est comment sortir de cela, je Pensé à arrêter la première file d'attente lorsque le second arrivé, mais GCD n'a pas cette option ... Toute autre façon de faire cela, espérons-le sans recodage majeur, de toute façon en ce qui concerne désormais les idées, de sorte que tout indice aidera. p> p> getpeople code> qui doit chercher des images d'utilisateurs à partir du serveur . Pour ne pas bloquer l'application, j'ai utilisé ceci: p>
getpeople code> Je stocke les données dans un nsmutableArraRay, alors lorsque les 2 files d'attente exécutées simultanément simultanément sur le même tableau et que l'application se bloque en cas d'exception hors limites.
La manière dont
getpeople code> passe par les données est quelque chose comme ça: p>
3 Réponses :
Vous avez raison, il n'ya aucun moyen d'arrêter une file d'attente qui a été envoyée. Une chose que vous pourriez faire pour vous assurer qu'une seule file d'attente accède à Si vous souhaitez simplement éviter que les utilisateurs cliquent sur le bouton plusieurs fois, vous pouvez utiliser une variable BOOL < Code> Stillexecuting Code> qui est défini sur getpeople code> en même temps utilise Semaphores ( Cela pourrait être encore plus intéressant ).
Oui CODE> dans votre Dispatch Synchrone et défini sur
Non code> à la fin de
getPeople code>. Avant de créer
getPeoplequeue code> Vous vérifiez simplement si
getpeople code> est toujours en cours d'exécution. P>
Je vais jeter un coup d'œil sur le lien, mais mon comportement souhaité serait que l'utilisateur n'attendrit pas ces données à télécharger s'il n'est plus intéressé. Je prendrais même aussi bien si je pouvais envoyer une file d'attente différente chaque fois que l'utilisateur tapote le bouton. Puis-je faire cela? Et aussi je vais avoir des problèmes si je le fais ... :)
Ou même un sémaphore qui bloque le code si le fil n'est pas le plus récent? Est-ce possible?
Je suggérerais que vous éviteriez la synchronisation avec des sémaphores, si possible. La conception de la GCD est d'éviter cela. Une tâche de fond devrait préparer des données mais ne pas toucher l'état extérieur. Lorsque les données sont préparées, il devrait envoier la mise à jour de l'état extérieur vers une file d'attente série ou, si l'état est lié à l'interface graphique, à la file d'attente principale.
Donc, quelque chose comme ceci: P>
-(void)getPeople:(NSDictionary *)peopleDictionary{ //I receive an NSDictionary and I go through it NSArray *keys = [peopleDictionary allKeys]; for(NSString *key in keys){ //Complex operation that are not important dispatch_async(dispatch_get_main_queue(), ^{ [peopleInArray addObject:<whatever>]; }); } }
nsstring * lastlogintime = @ "votre dernière heure de connexion";