2016-02-04 49 views
0

在我的iOS應用程序中,我使用AFNetworking庫來管理所需的HTTP操作。AFNetworking當請求成功時下載並保存數據

我創建了一個方法來下載文件:

+ (void)downloadFile:(File *)file progress:(void (^)(NSUInteger receivedBytes, long long totalReceivedBytes, long long totalExpectedBytes))progress success:(void (^)())success failure:(void (^)(NSError *error))failure 
{ 
    NSURLRequest *request = [NSURLRequest requestWithURL:file.url]; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

    operation.outputStream = [NSOutputStream outputStreamToFileAtPath:[FCFileManager pathForTemporaryDirectoryWithPath:file.key.lastPathComponent] append:NO]; 

    [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) 
    { 
     progress(bytesRead, totalBytesExpectedToRead, totalBytesExpectedToRead); 
    }]; 

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 
    { 
     success(); 
    } 

    failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    { 
     failure(error); 
    }]; 

    [operation start]; 
} 

雖然沒有采用這種方法的一個問題。如果正在取消下載(強制退出),則仍然可以在應用程序目錄中找到該文件。如何創建文件下載,僅在下載成功完成時纔將文件保存到文檔目錄?

+0

也許在completionBlock中你可以捕捉到operation.error。如果爲零,則下載完成。 – Quetool

回答

1

我建議下載將文件保存在臨時文件位置,然後在完成塊中將生成的臨時文件複製到「活動」位置。當應用程序啓動時,在臨時位置的任何數據可被視爲不完整或刪除

+0

這聽起來像一個工作...也許有更好的方式來處理下載操作? –

+0

您只有其他選項是在將文件下載到磁盤時將其寫入磁盤,但將其保存在內存中。這確實意味着當下載大文件時,您將使用所有設備的內存。 @flaxicode的建議被廣泛使用,並被普遍接受爲一個很好的解決方案。 – rckoenes

0

從Foundation框架本身使用NSUrlSession將處理自己失敗的下載:

- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData 
            completionHandler:(void (^)(NSURL *location, 
                   NSURLResponse *response, 
                   NSError *error))completionHandler 

你應該通過一個nil完成處理程序僅在創建 會話時創建任務,其會議的代表包括 URLSession:downloadTask:didFinishDownloadingToURL:方法。

您的應用程序可以通過兩種方式獲得resumeData對象:

  • 如果您的應用程序通過調用 cancelByProducingResumeData取消現有的傳輸:,會話對象傳遞一個resumeData 對象來完成處理您提供在那個電話中。

  • 如果傳輸失敗,會話對象向其委託或任務的完成處理程序提供一個NSError對象 。在那個 對象中,userInfo 字典中的NSURLSessionDownloadTaskResumeData鍵包含一個resumeData對象。

後創建任務,必須通過調用其簡歷 方法啓動它。

如果請求成功完成,則 完成處理程序塊的位置參數包含臨時文件的位置, ,錯誤參數爲零。如果請求失敗,地址 參數爲零,並且錯誤參數包含有關 失敗的信息。

如果你想使用AFNetworking的話,它應該完全兼容,因爲它有AFURLSessionManager來處理NSUrlSession

+0

你是說根據例子下載:https://github.com/AFNetworking/AFNetworking? –

+0

我正在談論文件下載的一般情況,正如我所說的,Apple已經在他們的框架中處理了您需要的內容,而無需創建臨時文件。文件很清楚。 – GoRoS