Le Multithreading dans iOS - comment forcer un thread à attendre pour un état?
Je suis en création d'une application qui extrait un ensemble de résultats à partir d'une base de données - je utiliser MBProgressHUD pour montrer le progrès de la requête avec une animation. La méthode que j'utilise les appels de l'animation lors de l'exécution d'une méthode dans un autre thread, et une fois que c'est fait, il se cache de l'animation. Ma question est, après l'appel:
[HUD showWhileExecuting:@selector(getResults) onTarget:self withObject:nil animated:YES];
Je voudrais, si il n'y a pas de résultats, afficher un message d'alerte disant cela, et si il y a, de charger la vue suivante. Jusqu'à présent, j'ai ce code:
[HUD showWhileExecuting:@selector(getResults) onTarget:self withObject:nil animated:YES];
if(self.thereAreEvents) {
[self performSegueWithIdentifier:@"searchResults" sender:self];
} else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No results" message:@"Sorry, there are no results for your search. Please try again." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
[alert release];
}
self.thereAreEvents
obtient à la fin de la getResults
méthode. Toutefois, cette méthode est appelée dans un autre thread dans cette ligne de l'exécution continue et montre l'alerte, même si il y a des événements dans la base de données.
Donc, d'ici la, j'ai deux questions: Quelle est la façon la plus simple à mettre en œuvre une attente du signal mécanisme iOS et quel est le moyen le plus efficace pour mettre en œuvre ce type de mécanisme dans iOS?
Merci!
Vous devez vous connecter pour publier un commentaire.
Vous pourriez aussi envisager un
NSConditionLock
.De sorte qu'il serait quelque chose comme ça sur le thread 1:
Et de la PALETTE:
Si une bien meilleure solution serait de passer d'un bloc ou d'une cible de sélection de la PALETTE qu'il consiste à effectuer lorsque les résultats sont récupérés.
EDIT: donc vous retrouver avec un code comme:
Et de la PALETTE:
Avec la PALETTE d'avoir le supplément de l'intelligence de prendre un
dispatch_block_t
comme un dernier argument, et de l'appeler quand les résultats sont (si garantissant l'expédition de retour vers le thread principal ou autre).TWRequest
ouACAccountStore
. En fait, il serait probablement préférable d'utilisercompletionHandler:
plutôt queperformWhenFinished:
pour alimenter le bloc, conformément à la convention qui semble émerger.Vous pouvez utiliser une longue boucle d'attente pour un accès rapide et sale solution:
Dans la “vraie” code il est préférable d'utiliser un sémaphore:
C'est mieux que la boucle occupée parce que le thread bloqué ne mange pas de temps CPU.
La meilleure solution est de garder de blocage et de refonte de votre code afin de travailler de manière asynchrone. Dans votre cas, vous devez afficher un spinner et démarrer le téléchargement des données. Lorsque les données est terminé le téléchargement, vous devriez recevoir un rappel asynchrone (soit par le biais d'un bloc ou d'un objectif/action de rappel) et d'afficher les résultats ou afficher les alertes d'erreur. Blocage avec une longue boucle ou un sémaphore est un homme pauvre solution dans ce cas.
Ne sais pas si c'est la meilleure façon de le faire, mais je vais essayer, à l'aide d'une boucle while pour observer certains booléenne avec quelque chose comme [NSThread sleepForTimeInterval:1]; à l'intérieur de la boucle.
Peut-être définir un délai d'attente ainsi.
C'est votre manière:
La Simultanéité Guide De Programmation
Aussi: La synchronisation
Plus forte: L'Utilisation De Verrous. Je crois que le dernier pourrait donner la meilleure aide.
Une autre approche simple, c'est mauvais, mais fonctionne
vous pouvez utiliser dispatch_time_t comme..