Frage

I (Grundsätzlich) Notwendigkeit, einen Hintergrund-Timer auf iOS 4 zu erstellen, die mir erlauben wird, einen Code auszuführen, wenn eine bestimmte Zeit vergangen ist. Ich habe gelesen, dass Sie dies mit einigen [NSThread detachNewThreadSelector: toTarget: withObject:]; erreichen kann, aber wie funktioniert das in der Praxis? Wie kann ich sicherstellen, dass der Faden auch im Hintergrund bleibt. Lokale Benachrichtigungen werden nicht Arbeit für mich, wie ich Code ausführen müssen, nicht den Benutzer benachrichtigen.

würde Hilfe geschätzt!

War es hilfreich?

Lösung

Sie können die Teilnehmer anrufen verwenden, um ein Verfahren (Selektor) ein Objekt (toTarget) mit einem gewissen Parameter (withobject) in einem neuen Thread (detachNewThred) auszuführen.

Wenn Sie nun eine verzögerte Aufgabe ausführen möchten, kann der beste Ansatz ist performSelector: withObject: afterDelay: und das, wenn Sie die Aufgabe auf den Hintergrund Aufruf der detachNewThreadSelector: toTarget: withObject:

laufen

Andere Tipps

Sie können auch diese mit Grand Central Dispatch (GCD) tun. Auf diese Weise können Sie Blöcke verwenden Sie den Code an einem Ort zu halten, und sicher sein, bist du wieder den Haupt-Thread aufrufen, wenn Sie Ihre UI aktualisieren müssen, nachdem Sie fertigen Hintergrundverarbeitung 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/ Bibliothek / ios / # Dokumentation / Leistung / Reference / GCD_libdispatch_Ref / Reference / reference.html

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

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

Sind diese vorgeschlagenen Verfahren nur anwendbar, wenn die Anwendung für die Ausführung im Hintergrund aktiviert (mit UIBackgroundMode) in erster Linie?

nehme ich an, wenn eine Anwendung nicht rechtmäßig Anspruch eine voip / Musik / Lage bewusst App dann, wenn es implementiert, was hier beschrieben wird, wird es nicht ausgeführt wird, wenn das Zeitintervall abgelaufen ist?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top