2012-06-20 2 views
6

Мне нужно скачать файлы> 500 Mo с AFNetworking. Иногда время их загрузки составляет> 10 минут, и если приложение находится в фоновом режиме, загрузка не может быть завершена.AFNetworking + большие файлы для скачивания + резюме загрузки

Так что я хочу попробовать частичную загрузку. Я нашел много ссылок, и это кажется возможным с помощью методов pause() и resume() в AFHTTPRequestOperation.

На самом деле, я сделал:

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

DownloadOperation подкласс AFHTTPRequestOperation (Singleton).

И в AppDelegate:

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

Сервер OK, чтобы получить новый диапазон в заголовках ...

Мои вопросы:

1) Является ли-т хороший способ сделать Это ? 2) Требуется ли резюме для изменения outputStream (append: 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 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

6

Обновление:

В steipete может обыкновение поддерживать AFDownloadRequestOperation любой больше (https://github.com/steipete/AFDownloadRequestOperation/pull/68). NSURLSessionDownloadTask может быть лучшим выбором.


https://github.com/steipete/AFDownloadRequestOperation

Кроме того, я пишу Lib базу на AFDownloadRequestOperation: https://github.com/BB9z/RFDownloadManager