10 Stimmen

PerformSelector After delay läuft nicht im Hintergrundmodus - iPhone

Ich habe auch eine VoIP-Anwendung, die ständig im Hintergrund läuft. Während ich im Hintergrund bin, rufe ich vom Hauptthread aus an: (um eine Netzwerkverbindung herzustellen, falls ich einen Netzwerkverlust diagnostiziere).

[self performSelector :@selector(Reconnect:) withObject:nil afterDelay:60.0];

Der Selektor wird jedoch nur ausgeführt, wenn meine App in den Vordergrund zurückkehrt. Sollte ich etwas Bestimmtes tun, damit der Selektor im Hintergrund ausgeführt wird?

Danke

Edit :

-(void) reconectInBackgroundAfterDelay:(NSTimeInterval) dealy
{
    NSLog(@"reconectInBackgroundAfterDelay");
    UIApplication*   app = [UIApplication sharedApplication];

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    // Start the long-running task and return immediately.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        [self performSelector :@selector(Reconnect:) withObject:nil afterDelay:dealy];

        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    });
}

Ich habe stattdessen diesen Code hinzugefügt, aber die Methode "Reconnect" wird immer noch nicht nach der angegebenen Verzögerung aufgerufen. Ich rufe die Methode "reconectInBackgroundAfterDelay" auf, während ich mich bereits im Hintergrund befinde.

Haben Sie noch andere Vorschläge?

Bearbeiten 2 Ich habe eine Lösung gefunden. Siehe unten

22voto

Idan Punkte 5597

Die einzige Lösung, die ich bis jetzt gefunden habe:

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

        NSTimer* t = [NSTimer scheduledTimerWithTimeInterval:1 target:self  selector:@selector(Reconnect:) userInfo:nil repeats:NO];    

        [[NSRunLoop currentRunLoop] addTimer:t forMode:NSDefaultRunLoopMode];

        [[NSRunLoop currentRunLoop] run]; 
    });

1voto

Akshay Punkte 5729

Haben Sie diese Zeile in der beginBackgroundTaskWithExpirationHandler blockieren? Schauen Sie sich den Abschnitt Fertigstellung einer Aufgabe von endlicher Länge im Hintergrund en http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.html .

1voto

DDZ Punkte 11

Ich war Test es für einige Zeit, gefunden, dass in ios Hintergrund laufen, wenn ein corebluetooth Ereignis kommt, wenn Sie etwas tun wollen, verwenden Sie NSTimer ObjektSie müssen weniger als 10 Sekunden, und wenn mehr als 10 Sekunden, der Timer wird ungültig sein.

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