2009-09-14 5 views
4

Est-il possible d'appeler ma fonction en arrière-plan après certains intervalles par programmation dans le développement de l'iPhone SDK? Je veux appeler une fonction particulière en arrière-plan pour certains intervalles de temps (peut être toutes les 10 minutes) au cours de mon application dans le courant ..iPhone-SDK: appelle une fonction en arrière-plan?

Pourriez-vous s'il vous plaît partager vos idées.

merci.

Clave/

Répondre

5

Vous pouvez avoir une minuterie, se pencher sur NSTimer pour ce qui se déclenche tous les 10 minutes, afin de rendre i t arriver i n l'arrière-plan, vous avez quelques options de nom malade deux. Tout d'abord, aucune interface utilisateur ne doit être effectuée dans un autre thread car UIKit n'est pas sécurisé par les threads.

référence NSThread ici http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSThread_Class/Reference/Reference.html

de référence NSTimer ici http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html

2

Pour appeler la fonction sur le thread principal, utilisez un NSTimer.

Pour appeler sur un autre fil, créez un NSOperation et mettre en place un NSOperationQueue pour l'appeler.

+0

merci beaucoup. En général –

9

plus simple est de prévoir une NSTimer sur les fils conducteurs en boucle de fonctionner. Je suggère que le code suivant est implémenté sur votre délégué d'application et que vous appelez setupTimer de applicationDidFinishLaunching:.

-(void)setupTimer; 
{ 
    NSTimer* timer = [NSTimer timerWithTimeInterval:10 * 60 
              target:self 
             selector:@selector(triggerTimer:) 
             userInfo:nil 
              repeats:YES]; 
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
} 

-(void)triggerTimer:(NSTimer*)timer; 
{ 
    // Do your stuff 
} 

Si vos trucs ici prend beaucoup de temps, et vous ne pouvez pas tenir le fil conducteur alors soit appeler vos affaires à l'aide:

[self performSelectorInBackground:@selector(myStuff) withObject:nil]; 

Ou vous pouvez exécuter le NSTimer sur un arrière-plan fil par quelque chose comme ça (je suis l'objet intentionnellement une fuite de fil):

-(void)startTimerThread; 
{ 
    NSThread* thread = [[NSThread alloc] initWithTarget:self 
              selector:@selector(setupTimerThread) 
              withObject:nil]; 
    [thread start]; 
} 

-(void)setupTimerThread; 
{ 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
    NSTimer* timer = [NSTimer timerWithTimeInterval:10 * 60 
              target:self 
             selector:@selector(triggerTimer:) 
             userInfo:nil 
              repeats:YES]; 
    NSRunLoop* runLoop = [NSRunLoop currentRunLoop]; 
    [runLoop addTimer:timer forModes:NSRunLoopCommonModes]; 
    [runLoop run]; 
    [pool release]; 
} 

-(void)triggerTimer:(NSTimer*)timer; 
{ 
    // Do your stuff 
} 
+0

NSTimers ne doit être prévu sur les sujets que vous pouvez être certain d'avoir une runloop (il n'y a aucune garantie performSelectorInBackground appellera le sélecteur sur un fil qui a un runloop). Pour les threads créés manuellement ou performSelectorInBackground, il est correct de lancer immédiatement le thread et de le mettre en veille, ou de programmer le timer sur le thread principal, puis de lancer le thread d'arrière-plan uniquement lorsque le timer se déclenche. – rpetrich

+0

Salut, Ça ne marche pas pour moi. Dans mon cas, j'essaie de lancer la minuterie en arrière-plan (ce qui signifie que je veux exécuter cette minuterie et certaines méthodes, lorsque l'application est passée en arrière-plan). Pouvez-vous m'aider à cela? – Satya

+0

@peylow il se déclenchera même nous ne fermons pas notre application, mais appuyé sur le bouton d'accueil et de travail sur un autre app.is il possible.If donc alors tout limitatin de temps en cours d'exécution fil d'arrière-plan trigger.please me guider.Merci –

Questions connexes