2012-06-19 5 views
13

Sto creando un'applicazione in cui sto scaricando alcuni dati dal server. Andando in background, voglio che la connessione continui a funzionare in modo che i dati possano essere scaricati. So che c'è metodo nella AppDelegateContinua il download in background

- (void)applicationDidEnterBackground:(UIApplication *)application 

che viene chiamato quando l'applicazione entra sfondo. Ma come viene creata la connessione in viewController, come può essere gestita nell'app Delegate?
Inoltre è/ci sono altri modi per fare ciò? Ho attraversato il link this ma c'è qualcosa di semplice da implementare?

+0

che è il mezzo ufficiale per farlo, thre sono altri modi, per quanto ne so –

+0

si dovrebbe verificare questo link http://stackoverflow.com/questions/4579810/ios-application-background-downloading – swiftBoy

risposta

14

Un modo per eseguire alcune operazioni che continuano in background è creare un thread separato per eseguire il download. All'interno della discussione, raggruppare le operazioni di download tra le chiamate su beginBackgroundTaskWithExpirationHandler: e endBackgroundTask. Non è necessario verificare se si sta eseguendo in background o no, si chiamano sempre questi due metodi.

// Tell iOS this as a background task in case we get backgrounded 
UIBackgroundTaskIdentifier taskId = [[UIApplication sharedApplication] 
      beginBackgroundTaskWithExpirationHandler:NULL]; 

//---------------------------------------------- 
// Perform your download operations here 
//---------------------------------------------- 
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 

// Tell iOS that we are done with stuff that needed to keep going even if backgrounded  
[[UIApplication sharedApplication] endBackgroundTask:taskId]; 
+1

È possibile impostare la proprietà ASIHttpRequest: [request setShouldContinueWhenAppEntersBackground: YES]; – HelloWorld

+0

Grazie mille !!! Per favore correggimi se ho torto: per concludere, non c'è quasi nessuna differenza tra l'esecuzione dell'attività in background o in primo piano. Entrambi verrebbero eseguiti con questo codice. Ancora 2 differenze vengono in mente: 1.** se ** il tuo task in background è troppo lungo, allora potresti essere terminato prima di terminarlo! 2. È meglio 'endBackgroundTask: taskId' in modo da risparmiare batteria extra. – Honey

4

[modifica] Siamo spiacenti, non ero corretto, come è stato sottolineato nei commenti è possibile estendere il limite di tempo che è necessario eseguire le operazioni una volta/prima che l'app passi in secondo piano. Ecco Apple's Official Documentation

+0

Questo non è vero, è possibile eseguire un [Attività a lunghezza finita] (http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/ doc/uid/TP40007072-CH4-SW28) in background per un massimo di 10 minuti. – rckoenes

+0

@rckoenes hai ragione, le mie scuse. Modificherò la mia risposta. Grazie per l'informazione :) – bennythemink

+0

Ancora non è vero, puoi chiamare ['beginBackgroundTaskWithExpirationHandler:'] (http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html# // apple_ref/occ/instm/UIApplication/beginBackgroundTaskWithExpirationHandler :) prima dell'esecuzione dell'attività Finite-Length. Non è necessario eseguire le operazioni dopo aver eseguito lo sfondo. Puoi iniziare l'attività prima che la tua app venga trasferita sullo sfondo. – rckoenes

1

Non so come gestisci il download dei dati esattamente. Ma puoi dare un'occhiata a ASIHTTPRequest. È molto semplice e intuitivo e funziona con ARC se si impostano i flag del compilatore su -fno-objc-arc. Con questo devi solo usare

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
[request setShouldContinueWhenAppEntersBackground:YES]; //For iOS 4.0 and up 

E che funziona.

Here si può vedere come funziona ASIHTTPRequest

Speranza che aiuta!

+0

ASIHTTPRequest non è più sviluppato attivamente ... come da messaggio [qui] (http://allseeing-i.com/ASIHTTPRequest/). Sto solo dicendo – zero0cool

+0

Vero, ma funziona ancora come un fascino. Non ho trovato nessuna valida alternativa con tutte le funzionalità di ASIHTTPRequest. – Thermometer