2011-10-09 16 views
10

Ho un'applicazione VoIP che viene eseguita costantemente anche sullo sfondo. Mentre sono in background sto chiamando dal thread principale: (per stabilire una connessione di rete nel caso in cui diagnostichi una rete persa).PerformSelector Dopo il ritardo non viene eseguito in modalità background - iPhone

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

Tuttavia, il selettore viene eseguito solo quando la mia app torna in primo piano. Devo fare qualcosa in particolare per far sì che il selettore venga eseguito mentre è in background?

Grazie

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; 
    }); 
} 

ho aggiunto questo codice, invece, ma ancora il metodo "Reconnect" non è sempre chiamato dopo il ritardo previsto. Io chiamo il metodo "reconectInBackgroundAfterDelay" mentre sono già in background.

Altri suggerimenti?

Modifica 2 Trovato una soluzione. Vedi sotto

risposta

22

L'unica soluzione che ho trovato finora:

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]; 
    }); 
+0

Grazie mille, funziona bene. –

+0

La mia applicazione è anche un'applicazione voip. Ma inizialmente la mia app scarica i file dal server prima di registrarsi. È possibile continuare a scaricare utilizzando la soluzione. –

+0

Ecco [http://stackoverflow.com/questions/14828955/download-files-using-http-request-in-background-in-iphone-above-ios-4-0#comment20777172_14828955] [La mia domanda] –

1

Hai inserito questa riga nel blocco beginBackgroundTaskWithExpirationHandler? Dai un'occhiata alla sezione Completando un'attività di lunghezza finita in background allo http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.html.

+0

Non sto utilizzando un'attività in background, la mia app è un'applicazione voip in modo che possa funzionare costantemente in background, mantenendo una connessione di rete persistente. Non vedo un motivo utilizzando un'attività in background qui, non riesco a vedere come potrebbe essere d'aiuto. – Idan

+0

Le applicazioni VoIP non vengono eseguite costantemente in background. Da [Guida alla programmazione dell'applicazione iOS] (http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH5- SW15): "Anziché mantenere attive le applicazioni VoIP tutto il tempo, il sistema consente loro di essere sospese e fornisce funzionalità per il monitoraggio dei socket per loro. Quando viene rilevato il traffico in entrata, il sistema riattiva l'applicazione VoIP e restituisce il controllo delle sue prese ad esso. " – omz

+0

Ok, allora diciamo che ho perso la mia connessione TCP in background e voglio programmare un selettore dopo 2 minuti per ristabilire la connessione. Se eseguirel'elegazionedopo non lo farà, come dovrei realizzarlo? ovviamente l'attività in background non è adatta qui. – Idan

1

ero prova per qualche tempo, ha scoperto che in ios fondo corsa quando un evento corebluetooth venire, se si vuole fare qualcosa di ritardo uso oggetto NSTimer, devi essere inferiore a 10 secondi, e se più di 10 secondi, il timer non sarà valido.

+1

qual è il significato di 10 secondi qui? puoi spiegarlo in modo logico? – Swamy

+0

Ci scusiamo per il ritardo di risposta, lasciatemi fare un esempio vedere il codice seguente, se DELAY_EVENT_TIME più di 10, questo doSomething func non sarà chiamato #define DELAY_EVENT_TIME 8 - (void) centralManager: (CBCentralManager *) centrale didConnectPeripheral: (CBPeripheral *) periferica { [NSTimer scheduledTimerWithTimeInterval: DELAY_EVENT_TIME target: self selector: @selector (doSomething) userInfo: nil ripetizioni: NO]; } - (void) doSomething { \t NSLog (@ "doSomething ritardo!"); } – DDZ

Problemi correlati