Asynchrone exécution de la fonction?
dans mon application iOS je ne les suivants.
viewDidAppear(){
//Load a spinner in a view on the top
[DSBezelActivityView newActivityViewForView:self.view];
//Execute code that require 3 seconds
...
//Stop the spinner
[DSBezelActivityView removeViewAnimated:YES];
}
Le problème est que le compteur ne s'affiche pas, car le cpu est de travailler dur (quelque chose de similaire). C'est comme cela que le code betweek le start et le stop a la préséance sur le rendu de la vue.
J'aimerais trouver une façon de montrer efficacement le début de la fileuse, sans l'aide d'une minuterie afin de retarder l'exécution de code.
Grâce
Vous devez vous connecter pour publier un commentaire.
Si vous avez une méthode comme
il y a plusieurs façons d'appeler à partir d'un autre thread. Choisissez l'une des options suivantes:
Alt + cliquez pour plus de détails.
Code de déplacement entre le démarrage et l'arrêt de l'indicateur d'activité dans le thread séparé parce que c'est le blocage de thread principal. C'est pourquoi l'indicateur d'activité n'est pas à l'affiche.
Edit: Exemple
Je suis d'accord avec la 1ère réponse avec un couple de modifications. Je suis juste allé à travers ce exactement le même problème. Le problème est que tout ce graphique va automatiquement passer à l'arrière-plan de mise à jour lorsque vous disposez d'un code qui prend du temps pour passer à travers. Jeter le cône à l'arrière-plan est ce qu'il essantially faire de toute façon. Ce que vous voulez, c'est (malheureusement) pour vous principales au code de s'exécuter en arrière-plan et la fileuse au premier plan. Je sais que cela sonne mal, mais dans certains cas, permettant à votre code à exécuter un peu plus lentement pour indiquer que l'application est en train de faire quelque chose d'utile, est bénéfique pour l'utilisateur.
Afin d'obtenir le spinner de travail:
1) Prendre tout le code qui prend 3 secondes à s'exécuter, et les mettre dans une fonction qui est une fonction void
2) Instancier votre spinner mais de les stocker dans une variable qui est accessible à l'extérieur de votre viewDidAppear routine.
3) le Démarrage d'une nouvelle NSTimer avec qui fonctionne en permanence avec un incrément de tous les quarts de seconde ou deux. Je vais définir ce qui se passe dans la routine qui est appelée à chaque cycle plus tard.
4) Appel de la routine que vous avez créé à l'étape 1 à l'aide de la performSelectorInBackground capacité. Essentiellement, cela va maintenant lancer votre startup (3 secondes) en arrière-plan qui est vraiment la seule façon de permettre à l'animation spinner pour se montrer et vraiment animer.
5) Dans la routine que vous avez créé à l'étape 1, ajouter une ligne de code tout en haut qui met à jour une (global de l'objet) boolean true, indiquant que nous sommes au milieu de notre principal 3 deuxième routine.
6) À la fin de la routine définie à l'étape 1 ajouter une ligne de code de définir la même global défini à l'étape 5 de faux indiquant que nos 3 deuxième routine est terminée.
7) Dans la minuterie de routine, maintenant, nous voulons faire quelque chose qui ressemble à ce qui suit:
Si vous avez besoin de plus d'aide à ce sujet, je peux en effet de fournir des code exact. Jetez un oeil à l'exemple d'application que j'ai développé pour la Pepperdine Groupe de Nouvelles. Lorsque vous appuyez sur une touche, le compteur monte sur le coin supérieur droit de l'écran.
http://itunes.apple.com/us/app/pepperdine-graphic-for-iphone/id516343215?mt=8