Domanda

I (sostanza) necessità di creare un timer sfondo su iOS 4 che mi permetterà di eseguire del codice quando un determinato periodo di tempo è passato. Ho letto che è possibile eseguire questa utilizzando alcuni [NSThread detachNewThreadSelector: toTarget: withObject:]; ma come funziona in pratica? Come posso garantire che il filo rimane sullo sfondo anche. notifiche locali saranno non lavoro per me, come ho bisogno di eseguire codice, non informare l'utente.

Aiuto sarebbe apprezzato!

È stato utile?

Soluzione

È possibile utilizzare quelli chiamata per eseguire un metodo (selettore) di un oggetto (toTarget) con alcuni parametri (withObject) in un nuovo filo (detachNewThred).

Ora, se si desidera eseguire un compito ritardata può essere l'approccio migliore è performSelector: withObject: afterDelay: e, se si desidera eseguire l'attività su sfondo chiamata detachNewThreadSelector: toTarget: withObject:

Altri suggerimenti

È anche possibile eseguire questa operazione utilizzando Grand Central Dispatch (GCD). In questo modo è possibile utilizzare i blocchi per mantenere il codice in un unico luogo, ed essere sicuri che si sta chiamando ancora una volta il filo conduttore se è necessario aggiornare l'interfaccia utente dopo che hai finito l'elaborazione in background. Ecco un esempio di 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) di riferimento: http://developer.apple.com/ biblioteca / ios / # documentazione / performance / Reference / GCD_libdispatch_Ref / Reference / reference.html

blocchetti di riferimento: http: // sviluppatore .apple.com / library / ios / # featuredarticles / Short_Practical_Guide_Blocks / index.html% 23 // apple_ref / doc / uid / TP40009758

Background Task di riferimento: http://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/beginBackgroundTaskWithExpirationHandler :

Sono questi metodi suggeriti applicabile solo se l'applicazione è abilitata per l'esecuzione in background (utilizzando UIBackgroundMode), in primo luogo?

presumo se un'applicazione può pretendere legittimamente non essere una voip / musica / posizione app consapevoli poi se implementa quanto descritto qui non verranno eseguiti quando l'intervallo di tempo scade?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top