Pregunta

I (básicamente) necesidad de crear un temporizador de fondo en iOS 4 que me permitirá ejecutar algún código cuando una cantidad específica de tiempo ha pasado. He leído que se puede lograr esto utilizando algún [NSThread detachNewThreadSelector: toTarget: withObject:]; pero ¿cómo funciona eso en la práctica? ¿Cómo puedo estar seguro de que el hilo se mantiene en el fondo también. notificaciones locales no trabajo para mí, ya que necesito para ejecutar código, no notificar al usuario.

La ayuda sería apreciada!

¿Fue útil?

Solución

Puede utilizar los llamada a ejecutar un método (selector) de un objeto (toTarget) con algún parámetro (withObject) en un nuevo hilo (detachNewThred).

Ahora bien, si se desea ejecutar una tarea retardada puede ser el mejor enfoque es performSelector: withObject: afterDelay: y si desea ejecutar la tarea en el fondo de la llamada detachNewThreadSelector: toTarget: withObject:

Otros consejos

También puede hacerlo utilizando Grand Central Dispatch (GCD). De esta manera usted puede utilizar bloques para mantener su código en un solo lugar, y asegúrese de que está llamando el hilo principal de nuevo si es necesario actualizar la interfaz de usuario después de que haya terminado el proceso de fondo. Aquí hay un ejemplo básico:

#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) de referencia: http://developer.apple.com/ biblioteca / ios / # documentación / rendimiento / Referencia / GCD_libdispatch_Ref / Referencia / reference.html

bloques de referencia: http: // desarrollador .apple.com / library / ios / # featuredarticles / Short_Practical_Guide_Blocks / index.html% 23 // apple_ref / doc / uid / TP40009758

Antecedentes de referencia de la tarea: http://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/beginBackgroundTaskWithExpirationHandler :

Son estos métodos sugeridos sólo es aplicable si la aplicación está habilitada para ejecución en segundo plano (utilizando UIBackgroundMode) en el primer lugar?

supongo que si una aplicación puede reclamar legítimamente no ser un VoIP / música / ubicación de la aplicación consciente entonces si implementa lo que se describe aquí no se ejecutará cuando el intervalo de tiempo expira?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top