PerformSelector Nach Verzögerung läuft nicht in hintergrund-Modus - iPhone
Ich habe eine voip-Anwendung, die läuft ständig im hintergrund als gut.
Während ich mich im hintergrund, ich rufe aus der main-thread: (zum herstellen der Netzwerkverbindung, falls ich die diagnose von einem Netzwerk verloren).
[self performSelector :@selector(Reconnect:) withObject:nil afterDelay:60.0];
Allerdings, der Wähler wird nur durchgeführt, wenn meine app zurück in den Vordergrund zu stellen.
Sollte ich etwas tun, insbesondere, um den Selektor immer ausgeführt, während im hintergrund ?
Dank
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;
});
}
Fügte ich diesen code statt, aber immer noch den "Reconnect" Methode ist nicht immer aufgerufen, nachdem die Verzögerung zur Verfügung gestellt.
Ich nenne das "reconectInBackgroundAfterDelay" - Methode, während ich mich schon in den hintergrund.
Irgendwelche anderen Vorschläge ?
Edit 2
Eine Lösung gefunden. Siehe unten
InformationsquelleAutor Idan | 2011-10-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die einzige Lösung die ich bisher gefunden :
Meine Bewerbung ist auch voip-Anwendung. Aber zunächst meine app shoulld herunterladen von Dateien vom server, bevor Sie sich registrieren. Ist es möglich, auch weiterhin herunterladen, die mit Ihrer Lösung.
Hier ist [stackoverflow.com/questions/14828955/... [Meine Frage]
Ich nehme an, dieser code ersetzt die dispatch_async block in deiner Frage. Ist das richtig? Könntest du poste den vollen code-Lösung nur um klar zu sein?
Die NSRunLoop Klasse ist in der Regel nicht als thread-safe und Ihre Methoden sollten nur aufgerufen werden, im Kontext des aktuellen Threads. Man sollte niemals versuchen, die Methoden aufrufen, die von einer NSRunLoop Objekt läuft in einem anderen thread, da dies zu unerwarteten Ergebnissen führen können.
InformationsquelleAutor Idan
Haben, setzen Sie diese Zeile in der
beginBackgroundTaskWithExpirationHandler
block? Haben Sie einen Blick an der th in Abschnitt Abschluss einer Finite-Länge Task im Hintergrund bei http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.html.VoIP-Anwendungen laufen nicht ständig im hintergrund. Von der iOS Application Programming Guide: "Eher, als dass VoIP-Anwendungen wach die ganze Zeit, das system erlaubt Ihnen, zu werden, ausgesetzt, und bietet Einrichtungen für die überwachung Ihrer Steckdosen für Sie. Wenn eingehender Datenverkehr erkannt wird, das system weckt die VoIP-Anwendung und gibt die Kontrolle über seine sockets."
Ok, dann lasst uns sagen, ich verlor meinen tcp-Verbindung in den hintergrund, und ich will planen Sie eine Auswahl nach 2 Minuten, die Verbindung wiederherzustellen. Wenn performselectorafterdelay wird es nicht tun, wie soll ich es erreichen ? offensichtlich hintergrund-task ist hier nicht geeignet.
Es sei denn, es gibt einen Weg zu planen, die hintergrund-tasks, die ich nicht kenne.
performSelectorAfterDelay
es tun werde (wird ausgeführt) wenn Sie legte es in die hintergrund-task-block.InformationsquelleAutor Akshay
Ich war testen Sie es für einige Zeit, gefunden, dass bei ios im hintergrund laufen, wenn ein corebluetooth-Ereignis kommen, wenn Sie wollen, etwas zu tun Verzögerung verwenden NSTimer Objekt,Sie müssen weniger als 10 Sekunden dauert, und wenn mehr als 10 Sekunden, wird die Zeit ungültig.
Sorry für die späte Antwort, lassen Sie mich ein Beispiel geben, sehen Sie den folgenden code, wenn DELAY_EVENT_TIME mehr als 10, so doSomething func wird nicht aufgerufen #define DELAY_EVENT_TIME 8 - (void)centralManager:(CBCentralManager *)zentrale didConnectPeripheral:(CBPeripheral *)periphere { [NSTimer scheduledTimerWithTimeInterval:DELAY_EVENT_TIME Ziel:selbst selector:@selector(doSomething) userInfo:nil repeats:NO]; } - (void)doSomething { NSLog(@"doSomething Verzögerung!"); }
InformationsquelleAutor DDZ