Comment utiliser un NSTimer
? Quelqu'un peut-il me donner des instructions étape par étape?
objective-c
cocoa
nstimer
lab12
la source
la source
Réponses:
Tout d'abord, je voudrais attirer votre attention sur la documentation Cocoa / CF (qui est toujours un excellent premier port d'escale). Les documents Apple ont une section en haut de chaque article de référence appelée "Guides d'accompagnement", qui répertorie les guides pour le sujet en cours de documentation (le cas échéant). Par exemple, avec
NSTimer
, la documentation répertorie deux guides complémentaires:Pour votre situation, l'article Timer Programming Topics est probablement le plus utile, tandis que les sujets de threading sont liés, mais pas les plus directement liés à la classe en cours de documentation. Si vous jetez un œil à l'article sur les rubriques de programmation du minuteur, il est divisé en deux parties:
Pour les articles qui prennent ce format, il y a souvent un aperçu de la classe et de son utilisation, puis un exemple de code sur la façon de l'utiliser, dans ce cas dans la section "Utilisation des minuteurs". Il y a des sections sur "Créer et planifier une minuterie", "Arrêter une minuterie" et "Gestion de la mémoire". À partir de l'article, la création d'une minuterie non répétitive planifiée peut être effectuée comme suit:
Cela va créer une minuterie qui est déclenché après 2,0 secondes et appelle
targetMethod:
àself
avec un argument, qui est un pointeur vers l'NSTimer
instance.Si vous souhaitez ensuite regarder plus en détail la méthode, vous pouvez vous référer aux documents pour plus d'informations, mais il y a aussi des explications autour du code.
Si vous souhaitez arrêter un minuteur qui se répète (ou arrêter un minuteur non répétitif avant qu'il ne se déclenche), vous devez conserver un pointeur sur l'
NSTimer
instance qui a été créée; souvent, cela devra être une variable d'instance afin que vous puissiez vous y référer dans une autre méthode. Vous pouvez ensuite appelerinvalidate
l'NSTimer
instance:Il est également recommandé de
nil
supprimer la variable d'instance (par exemple, si votre méthode qui invalide le temporisateur est appelée plusieurs fois et que la variable d'instance n'a pas été définie surnil
et que l'NSTimer
instance a été désallouée, elle lèvera une exception).Notez également le point sur la gestion de la mémoire au bas de l'article:
la source
YES
pourrepeats:
quand tu appellesscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
. Si vous le faites, assurez-vous de conserver une référence à l'NSTimer
instance (elle est renvoyée par la méthode) et suivez le point sur la gestion de la mémoire comme je l'ai détaillé ci-dessus.target
etselector
. Par exemple, si votre cible estself
et que le sélecteur l'esttimerMethod:
, la méthode appelée lorsque le minuteur se déclenche esttimerMethod:
définie sur leself
. Vous pouvez ensuite mettre le code que vous voulez dans cette méthode, et la méthode sera appelée chaque fois que le minuteur se déclenchera. Notez que la méthode appelée lorsque le minuteur se déclenche (que vous passez en tant queselector:
) ne peut prendre qu'un seul argument (qui, lorsqu'il est appelé, est un pointeur vers l'NSTimer
instance).self
"il existe deux façons d'utiliser une minuterie:
1) minuterie programmée et utilisation du sélecteur
En guise de remarque, au lieu d'utiliser une minuterie qui ne se répète pas et appelle le sélecteur après un intervalle spécifié, vous pouvez utiliser une instruction simple comme celle-ci:
cela aura le même effet que l'exemple de code ci-dessus; mais si vous voulez appeler le sélecteur une nième fois, vous utilisez la minuterie avec des répétitions: OUI;
2) minuterie auto-programmée
3) Minuterie non planifiée et utilisation de l'invocation
et après cela, vous démarrez le minuteur manuellement chaque fois que vous en avez besoin comme ceci:
Et comme note, la méthode onTick: ressemble à ceci:
la source
Quelque chose comme ça:
la source
la source
MyViewController
jamais n'est désalloué.la source
Il manque une réponse à une heure précise de la journée, voici l'heure suivante:
Bien sûr, remplacez "doRefresh" par la méthode souhaitée par votre classe
essayez de créer l'objet calendrier une fois et de rendre les allUnits statiques pour plus d'efficacité.
l'ajout d'un composant à l'heure fonctionne très bien, pas besoin de test à minuit ( lien )
la source