Question

I (En gros) nécessité de créer une minuterie de fond sur iOS 4 qui me permettra d'exécuter un code lorsqu'une quantité spécifique de temps a passé. J'ai lu que vous pouvez accomplir cela en utilisant certains [NSThread detachNewThreadSelector: toTarget: withObject:]; mais comment est-ce que dans la pratique? Comment puis-je faire en sorte que le fil reste en arrière-plan aussi. notifications locales pas travail pour moi, comme je l'ai besoin d'exécuter du code, pas notifier l'utilisateur.

L'aide serait appréciée!

Était-ce utile?

La solution

Vous pouvez utiliser les appels à exécuter une méthode (sélection) d'un objet (toTarget) avec un paramètre (withObject) dans un nouveau thread (detachNewThred).

Maintenant, si vous voulez exécuter une tâche retard peut être la meilleure approche est performSelector: withObject: afterDelay: et si vous voulez exécuter la tâche sur appel d'arrière-plan du detachNewThreadSelector: toTarget: withObject:

Autres conseils

Vous pouvez aussi le faire en utilisant Grand Central Dispatch (GCD). De cette façon, vous pouvez utiliser des blocs pour garder votre code dans un seul endroit, et assurez-vous que vous appelez à nouveau le thread principal si vous devez mettre à jour votre interface utilisateur une fois que vous avez terminé le traitement de fond. 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/ bibliothèque / ios / # documentation / Performance / Référence / GCD_libdispatch_Ref / Référence / reference.html

Les blocs de référence: http: // développeur .apple.com / bibliothèque / 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 :

sont ces méthodes suggérées applicables que si l'application est activée pour l'exécution d'arrière-plan (à l'aide de UIBackgroundMode) en premier lieu?

Je présume que si une application ne peut légitimement prétendre à être un voip / musique / lieu app savoir alors si elle met en œuvre ce qui est décrit ici, il ne sera pas exécuté lorsque l'intervalle de temps expire?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top