2010-11-11 33 views
3

Je (Fondamentalement) besoin de créer un minuteur d'arrière-plan sur iOS 4 qui me permettra d'exécuter du code quand un certain laps de temps est passé. J'ai lu que vous pouvez accomplir cela en utilisant quelques [NSThread detachNewThreadSelector: toTarget: withObject:]; mais comment cela fonctionne-t-il dans la pratique? Comment puis-je m'assurer que le fil reste en arrière-plan aussi. Les notifications locales ne fonctionneront pas pour moi, car j'ai besoin d'exécuter du code, pas de notification à l'utilisateur.iOS4 Créer minuterie d'arrière-plan

L'aide serait appréciée!

Répondre

4

Vous pouvez utiliser ces appel pour exécuter une méthode (sélecteur) d'un objet (toTarget) avec un paramètre (withObject) dans un nouveau thread (detachNewThred).

Maintenant, si vous voulez exécuter une tâche retardée peut être la meilleure approche est performSelector: withObject: afterDelay: et si vous voulez exécuter la tâche sur fond appeler le detachNewThreadSelector: toTarget: withObject:

+0

l'approche 'beast' :) Ok, donc si je fais un thread avec' detachNewThreadSelector: toTarget: withObject: 'restera-t-il en arrière-plan? –

+0

jajaja, désolé de l'approche "bête" =/Yes il va s'exécuter en parallèle avec le thread principal, jetez un oeil aux méthodes 'performSelector' dans NSObject pour la liste complète des possibilités. –

+0

Un homme génial, merci beaucoup, j'avais tiré mes cheveux! :) –

20

Vous pouvez aussi le faire en utilisant Grand Central Dispatch (GCD) . De cette façon, vous pouvez utiliser des blocs pour conserver votre code au même endroit, et assurez-vous d'appeler à nouveau le thread principal si vous avez besoin de mettre à jour votre interface utilisateur après avoir terminé le traitement en arrière-plan. Voici un exemple de base:

#import <dispatch/dispatch.h> 

… 

NSTimeInterval delay_in_seconds = 3.0; 
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, delay_in_seconds * NSEC_PER_SEC); 
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

UIImageView *imageView = tableViewCell.imageView; 

// ensure the app stays awake long enough to complete the task when switching apps 
UIBackgroundTaskIdentifier taskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:{}]; 

dispatch_after(delay, queue, ^{ 
    // perform your background tasks here. It's a block, so variables available in the calling method can be referenced here.   
    UIImage *image = [self drawComplicatedImage];   
    // now dispatch a new block on the main thread, to update our UI 
    dispatch_async(dispatch_get_main_queue(), ^{   
     imageView.image = image; 
     [[UIApplication sharedApplication] endBackgroundTask:taskIdentifier]; 
    }); 
}); 

Grand Central Dispatch (GCD) Référence: http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

blocs Référence: http://developer.apple.com/library/ios/#featuredarticles/Short_Practical_Guide_Blocks/index.html%23//apple_ref/doc/uid/TP40009758

Contexte référence Tâche: http://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/beginBackgroundTaskWithExpirationHandler:

+0

+1 pour les blocs et GCD nouvelle hotness. – Kongress

+1

Mais ce dispatch_after ne fonctionne pas en arrière-plan. Pour vérifier le même mettre le code dans applicationDidEnterBackground: méthode et voir si votre bloc est appelé ou non. –

+1

Bon point - J'ai ajouté une tâche de fond à ma réponse. – mrwalker

0

que ces méthodes sont proposées applicable uniquement si l'application est activée pour l'exécution en arrière-plan (à l'aide de UIBackgroundM ode) en premier lieu?

Je suppose que si une application ne peut pas légitimement prétendre être une application VoIP/musique/localisation, alors si elle implémente ce qui est décrit ici, elle ne s'exécutera pas lorsque l'intervalle de temps expire?

+0

Non, ce n'est pas correct, cependant, les chances que l'application fonctionne encore sont minces, selon l'heure que vous définissez. Lorsque vous disposez d'une application VoIP/Musique/Emplacement, le système d'exploitation essaie généralement de continuer à fonctionner malgré tout, et n'arrête pas le processus pour libérer des ressources. –