2012-06-20 122 views
6

我需要下載文件> 500 Mo與AFNetworking。 有時,下載它們的時間大於10分鐘,如果應用程序在後臺,則下載無法完成。AFNetworking +大的下載文件+恢復下載

所以我想嘗試部分下載。我發現了很多鏈接,並且這似乎可以通過AFHTTPRequestOperation上的pause()和resume()方法來實現。

其實,我所做的:

[self.downloadOperation setShouldExecuteAsBackgroundTaskWithExpirationHandler:^{ 
    // Clean up anything that needs to be handled if the request times out 
    [self.downloadOperation pauseDownload]; 
    }]; 

DownloadOperation是AFHTTPRequestOperation(單身)的子類。

而且在AppDelegate中:

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    // resume will only resume if it's paused... 
    [[DownloadHTTPRequestOperation sharedOperation] resumeDownload]; 
} 

服務器即可得到頭的新範圍...

我的問題:

1)是-T的好辦法嗎它呢? 2)簡歷是否需要更改outputStream(追加:NO => append:YES)?或者 - 它由AFNetworking管理? (沒有找到)

self.outputStream = [NSOutputStream outputStreamToFileAtPath:self.filePath append:YES]; 

像這樣的東西(在DownloadHTTPRequestOperation):

- (void)pauseDownload 
{ 
    NSLog(@"pause download"); 
    [self pause]; 
} 

- (void)resumeDownload 
{ 
    NSLog(@"resume download"); 
    self.outputStream = [NSOutputStream outputStreamToFileAtPath:self.filePath append:YES]; 
    [self resume]; 
} 

感謝您的幫助。

回答

1

我最終使用舊的(非ARC)ASIHTTPRequest框架進行類似的任務。 AllowResumeForFileDownloads做你所需要的。請注意,您的服務器需要通過讀取範圍 http標頭來支持恢復。

if (![[NSFileManager defaultManager] fileExistsAtPath:downloadPath]){ 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDelegate:self]; 
    [request setAllowResumeForFileDownloads:YES]; 
    [request setDownloadDestinationPath:downloadPath]; 
    [request setTemporaryFileDownloadPath:tmpPath]; 
    [request startAsynchronous]; 
} 
+0

BTW AFNetworking也是 「非ARC」 – pahan

+1

AFNetworking現在啓用ARC。 – tangqiaoboy