3 Stimmen

iOS4 Hintergrund-Timer erstellen

Ich muss (im Grunde) einen Hintergrund-Timer auf iOS 4 erstellen, der es mir ermöglicht, einen Code auszuführen, wenn eine bestimmte Zeitspanne verstrichen ist. Ich habe gelesen, dass Sie dies mit einigen erreichen können [NSThread detachNewThreadSelector: toTarget: withObject:]; aber wie funktioniert das in der Praxis? Wie kann ich sicherstellen, dass der Thread auch im Hintergrund bleibt? Lokale Benachrichtigungen werden NICHT für mich funktionieren, da ich Code ausführen und den Benutzer nicht benachrichtigen muss.

Für Hilfe wären wir dankbar!

20voto

mrwalker Punkte 1853

Sie können dies auch mit Grand Central Dispatch (GCD) tun. Auf diese Weise können Sie Blöcke verwenden, um Ihren Code an einem Ort zu halten, und sicher sein, dass Sie den Hauptthread erneut aufrufen, wenn Sie Ihre Benutzeroberfläche aktualisieren müssen, nachdem Sie die Hintergrundverarbeitung abgeschlossen haben. Hier ist ein einfaches Beispiel:

#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) Referenz: http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

Blocks Referenz: http://developer.apple.com/library/ios/#featuredarticles/Short_Practical_Guide_Blocks/index.html%23//apple_ref/doc/uid/TP40009758

Hintergrund Aufgabenreferenz: http://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/beginBackgroundTaskWithExpirationHandler :

4voto

Bruno Berisso Punkte 1081

Sie können diese Aufrufe verwenden, um eine Methode (Selektor) eines Objekts (toTarget) mit einem Parameter (withObject) in einem neuen Thread (detachNewThred) auszuführen.

Wenn Sie nun eine verzögerte Aufgabe ausführen wollen, ist vielleicht die beste Vorgehensweise performSelector: withObject: afterDelay: und wenn Sie die Aufgabe im Hintergrund laufen lassen wollen, rufen Sie die detachNewThreadSelector: toTarget: withObject:

0voto

Gruntcakes Punkte 37284

Sind diese vorgeschlagenen Methoden nur anwendbar, wenn die Anwendung von vornherein für die Ausführung im Hintergrund aktiviert ist (mit UIBackgroundMode)?

Ich nehme an, wenn eine Anwendung nicht legitim behaupten kann, eine Voip-/Musik-/Standort-bewusste Anwendung zu sein, dann wird sie, wenn sie das implementiert, was hier beschrieben ist, nicht ausgeführt, wenn das Zeitintervall abläuft?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X