NSThread & NSProgressIndicator
yass_1988
Membre
Bonjour,
j'ouvre un nouveau sujet, voila la situation, j'ai une méthode qui est en charge de push vers des ViewController. Quand j'appel cette méthode, je me charge de l'appellé de manière synchrone.
Du coup ce que j'aimerais bien c'est que vu que ma méthode est appelé de manière synchrone, j'aimerais en même temps pouvoir afficher un progressIndicator, qui est arrêté une fois arrivé dans la la nouvelle vue.
C'est possible ?
j'ouvre un nouveau sujet, voila la situation, j'ai une méthode qui est en charge de push vers des ViewController. Quand j'appel cette méthode, je me charge de l'appellé de manière synchrone.
<br />
[color=#401082]<br />
[color=#000000][[/color][color=#b41ca4]self[/color][color=#000000] [/color]performSelectorInBackground[color=#000000]:[/color][color=#b41ca4]@selector[/color][color=#000000](pushView:) [/color]withObject[color=#000000]:nil];[/color][/color][color=#401082]<br />
[color=#000000]
[/color][/color]Du coup ce que j'aimerais bien c'est que vu que ma méthode est appelé de manière synchrone, j'aimerais en même temps pouvoir afficher un progressIndicator, qui est arrêté une fois arrivé dans la la nouvelle vue.
C'est possible ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Après, si tu avais une opération longue (genre algo de calcul) à exécuter en tâche de fond, il est plus simple d'utiliser GCD pour ça : tu affiche un truc pour faire patienter l'utilisateur (UIActivityIndicator par exemple), tu demandes à GCD d'exécuter ton algo long sur un thread (une "queue") secondaire, et une fois qu'il a fini, tu demandes à GCD d'exécuter sur le main thread le code qui masque le UIActivityIndicator (puisque c'est du code qui manipule l'UI, contrairement à ton algo long que tu as exécuté sur le thread secondaire)
Mais dans ton cas, tu sembles dire que le code que tu exécutes dans "pushView:" fait un push d'un UIViewController, ce qui veut dire que c'est qqch qui manipule l'IHM / l'UI, donc c'est forcément à faire dans le main thread, tu n'as pas le choix.
PS : Pour archive, si ton opération longue n'était pas une opération qui affecte l'UI comme le push d'un ViewController, (mais un algo de calcul ou un download de données réseau ou tout autre truc n'intervenant pas sur l'IHM), avec GCD ça se ferait comme ça :
mais du coup je me demandais si c'étais possible d'annuler la tâche de fond?
Imaginons que j'ai un viewController composé d'une tabBar, que je lance mon ActivityIndicator, pendant que mon code s'exécute en tâche de fond. Est il possible que pendant que mon ActivityIndicator tourne, je puisse annuler le code exécuter en tâche de fond on sélectionnant un de mes Items de ma tabBar et donc de terminer l'animation de mon ActivityIndicator ?
Si j'appuis sur un de mes item de la tabBAr, je peux arrêter l'activityIndicator avant qu'il ne s'arrête au moment prévus ?
Tu peux surveiller régulièrement dans ton algo si un flag "operationCancelled" est passé à YES ou pas, et si oui tout arrêter (en prenant soin de nettoyer derrière toi si tu avais des trucs en cours)
je relance le sujet, voila ou j'en suis, dans mon viewController, j'ai deux méthodes, -(void)sendRefreshDisplay et -(void)pushView:(NSIndexPath *)indexPath, la différence entre ces deux méthodes, c'est que pushView est appelé directement par mon viewController avec une méthode de détection d'un clique court sur un objet, pour me permettre de push vers une nouvelle vue,(riens de bien méchant), quand au deuxième, sendRefreshDisplay:, il est appelé après avoir sélectionné un bouton d'un UIActionSheet, actionSheet appelé dans le viewController, sauf que une fois le bouton appelé, je passe par une classe intermédiaire, qui va réaliser tout un long traitement et après appeler sendRefreshDisplay via un delegate implémenter par mon viewController.
Le constat est que pour ma méthode -(void)pushView:(NSIndexPath *)indexPath tout se passe bien, mon code s'exécute pendant que mon indcatorActivity tourne et s'arrête à la fin de mon code, parfait! Sauf que pour -(void)sendRefreshDisplay, mon code s'exécute, sans problème, mais mon indicatorActivity n'apparait pas et le plus étonnant c'est que à la base de cette méthode, j'ai l'actionSheet, et une fois le bouton sélectionné, la vue d'actionSheet ne disparait seulement arrivé à la ligne [/color]
Donc voila en attendant, je suis dans l'impasse.