2012-02-06 135 views
18

我一直在尋找幾個星期來嘗試找到答案或如何做到這一點的例子。如何在後臺繼續在前臺繼續使用NSURLConnection開始連接?

NSURLConnection的所有示例/教程都顯示它在前臺開始或從後臺開始,與beginBackgrounTaskWithExpirationHandler的所有示例一樣:顯示如何在進入後臺後啓動後臺任務。

據我所知,在互聯網或書籍上沒有任何東西顯示如何在前景中開始連接,然後如果未完成則在後臺繼續。

回答這個問題實際上並沒有回答這個問題:如果你看過referened超越基礎部分,它說

How should beginbackgroundtaskwithexpirationhandler: be dealt with for an NSUrlConnection that is already in progress?

:「雖然應用程序是在前臺,後臺任務贏得」沒有任何效果「。這意味着如果你想在前臺下載,在前臺使用NSURLConnection來啓動後臺任務是不可能的。

+0

文件稱「雖然應用程序是在前臺,後臺任務將不會有任何影響;但,如果用戶將應用程序移動到後臺,後臺任務的存在將自動保持應用程序運行,以便它可以完成操作。「這對我來說非常有意義,因爲後臺任務應該如何工作 - 一旦您在前臺開始任務(例如下載文件),如果應用程序進入後臺,它將完成下載任務,而不會減少網絡連接。 – sbs 2013-02-26 20:43:33

回答

38

您只需撥打beginBackgroundTaskWithExpirationHandler:當您開始下載過程時,您的應用程序在前臺右側。請注意,您必須返回值存儲在伊娃/屬性:

@property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundTaskID; 

@synthesize backgroundTaskID; 

... 

NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; 
self.backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
    // Cancel the connection 
    [connection cancel]; 
}]; 

這將使您的應用程序繼續運行,如果下載運行時,它就會被髮送到後臺。然後,在表示下載的完成你的委託方法,你必須把匹配endBackgroundTask:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    // Handle the error 
    ... 

    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskID]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // Save the downloaded data 
    ... 

    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskID]; 
} 
+0

只是試過這種方法,就像NSURLConnection的魅力一樣!謝謝! – sbs 2013-02-26 21:29:04

+0

請注意,現在這種方法在iOS 7以後只能在後臺運行3分鐘,有沒有辦法讓它活着? – CGR 2017-01-11 22:30:33

相關問題