2010-07-18 29 views
3

J'ai une application iPhone personnalisée qui ne repose en aucune façon sur UIKit (elle n'est pas liée à UIKit). Cela signifie que je n'utilise pas UIApplication et n'appelle donc pas UIApplicationMain.NSTimer ne fonctionne pas sans UIApplication?

Le problème est que lorsque je crée une minuterie, elle ne se déclenche jamais. La minuterie est créé comme ça:

[NSTimer timerWithTimeInterval:10 target:self selector:@selector(updateTime) userInfo:nil repeats:TRUE]; 

Je soupçonnant que le problème pourrait être exécuté en boucle liée comme après avoir fini l'initialisation de base dans « principal() », je fais ceci:

NSLog(@"Starting application ..."); 
applicationInstance = [MyApp alloc]; 
[applicationInstance setMainLayer:mainLayer]; 
[NSThread detachNewThreadSelector:@selector(runApplication) toTarget:applicationInstance withObject:nil]; 

CFRunLoopRun(); 

Je UIKit rétro-conçu et remarqué que UIApplication fait beaucoup plus de choses comme l'inscription pour les événements du système, etc NSTimer peut-être compter sur l'une de ces choses. L'autre chose que j'ai remarqué est que dans le délégué de UIApplication le thread est le même que dans main().

Comment puis-je obtenir NSTimer pour fonctionner correctement? Si c'est lié à la boucle d'exécution, quelqu'un peut-il signaler l'erreur? "CFRunLoopRun()" est utilisé pour raccrocher le thread principal afin que le reste de l'application puisse s'exécuter. Je ne pense pas que ce soit juste.

Éditer: Je pense que la boucle d'exécution doit être configurée. D'une certaine manière ...

Répondre

4

Votre problème est définitivement lié à la boucle; voir le NSTimer reference, en particulier, l'introduction:

minuteries fonctionnent conjointement avec des boucles d'exécution. Pour utiliser efficacement une minuterie, vous devez connaître le fonctionnement des boucles d'exécution (voir NSRunLoop et Threading Programming Guide). Notez en particulier que les boucles d'exécution conservent leurs minuteurs, de sorte que vous pouvez libérer une minuterie après l'avoir ajoutée à une boucle d'exécution.

+0

Alors, comment puis-je obtenir que cela fonctionne? Je suis vraiment confus en ce moment –

+0

Avez-vous consulté le Guide de programmation de Threaded? La section sur "Utiliser les boucles d'exécution"? Je n'ai pas encore créé mon propre Run Loop, mais ça me semble être un bon point de départ! –

+0

Oui, je l'ai fait. Il n'a fourni aucune information :( –

3

La solution est assez simple

NSTimer * timeUpdateTimer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(updateTime) userInfo:nil repeats:TRUE]; 
[[NSRunLoop mainRunLoop] addTimer:timeUpdateTimer forMode:NSDefaultRunLoopMode]; 

Merci pour la pointe Grenouille Shaggy