8
votes

Comment fonctionnent les files d'attente d'expédition?

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 getpeople qui doit chercher des images d'utilisateurs à partir du serveur . Pour ne pas bloquer l'application, j'ai utilisé ceci: xxx

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 getpeople 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 passe par les données est quelque chose comme ça: xxx

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.


0 commentaires

3 Réponses :


2
votes

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 à getpeople en même temps utilise Semaphores ( Cela pourrait être encore plus intéressant ).

Si vous souhaitez simplement éviter que les utilisateurs cliquent sur le bouton plusieurs fois, vous pouvez utiliser une variable BOOL < Code> Stillexecuting qui est défini sur Oui dans votre Dispatch Synchrone et défini sur Non à la fin de getPeople . Avant de créer getPeoplequeue Vous vérifiez simplement si getpeople est toujours en cours d'exécution. xxx


2 commentaires

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?



12
votes

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>];
         });
    }
}


0 commentaires

-1
votes

nsstring * lastlogintime = @ "votre dernière heure de connexion"; xxx


0 commentaires