2010-02-14 4 views
0

J'ai une application qui doit mettre à jour son affichage toutes les minutes. Pour ce faire, j'utilise performSelector: withObject: afterDelay, en appelant le sélecteur qui, la plupart du temps, change juste du texte dans une étiquette basée sur un calcul très simple (et rapide).Débogage d'une interface utilisateur iPhone qui ne répond pas

[self performSelector:@selector(updateDisplay) withObject:nil 
    afterDelay:60]; 

De temps en temps au cours d'une mise à jour, je dois partir et obtenir des données sur le web, et donc je le fais dans un autre thread utilisant detachNewThreadSelector. Tout a fonctionné et l'appel "performSelector after Delay" se termine en une fraction de seconde, et ne s'exécute qu'une fois par minute. Malgré cela, et malgré un fonctionnement correct sur le simulateur, le bouton unique de l'application ne répond pas, ne répond pas à plusieurs coups. Donc, j'avais supposé que peformSelector: afterDelay ne bloquerait pas, mais je me demande maintenant s'il bloque d'une façon ou d'une autre? J'ai même essayé de ne pas faire le web-look-up au cas où cela aurait eu un impact sur la réactivité. Pas de joie.

[NSThread detachNewThreadSelector:@selector(updateFromURL) 
    toTarget:self withObject:nil]; 

je puis poussé par le requin pour voir si je pouvais voir quelque chose d'évident. De là, je peux voir que la recherche sur le Web est la seule chose qui prend du temps, mais cela ne se fait que toutes les deux minutes, et de toute évidence ne pas fonctionner sur le fil principal. L'application elle-même consomme une fraction minuscule de 1% du CPU (0.0000034%) sur 20 minutes, donc cela doit juste être un problème de blocage.

Alors, est-ce qu'il me manque quelque chose à propos de performSelector: afterDelay? Quelles autres erreurs courantes de débutant pourrais-je faire. Si cela aide, bien que je développe des applications depuis plus de 20 ans, les 10 précédentes ont été en grande partie Java. Peut-être que j'ai une hypothèse Java chargé :-) Essentiellement, j'ai supposé que le fil principal est comme l'EDT (seulement faire des choses sur l'interface utilisateur, mais gardez tout le reste).

Répondre

1

Pourquoi ne pas essayer performSelectorInBackground et garder un sémaphore booléen/ou une file d'attente de nombre de requêtes?

Le cas d'utilisation doit être défini: Si vous écrasez sur le bouton, doit-il faire la demande une fois ou plusieurs fois?

+0

Il n'y a pas de problème de requête multiple, il ne recevait pas la première requête. J'ai fait du profilage lourd, n'offrant aucune valeur réelle (sauf pour indiquer qu'il ne devrait pas y avoir de problème). J'ai maintenant re-factorisé et utilisé une minuterie plutôt que performSelector: afterDelay et ça semble avoir aidé, je pense qu'il y a un peu de subtile de la boucle en cours ici. – rougeExciter

Questions connexes