天天看點

ASIHTTPRequest使用過程中遇到的問題及解決辦法轉之薄桜の霊

  關于這一點官方的文檔已經有詳細的說明,我把它列出來隻是為了友善日後參考。

  首先需要把源碼裡的檔案引用到現有工程,如果隻是用到基礎功能的話,隻需引用下圖所示的檔案:

  

ASIHTTPRequest使用過程中遇到的問題及解決辦法轉之薄桜の霊

  然後需要添加CFNetwork, SystemConfiguration, MobileCoreServices, CoreGraphics 和 zlib這些framework,添加方法如下圖:

ASIHTTPRequest使用過程中遇到的問題及解決辦法轉之薄桜の霊

  我的下載下傳隊列大概有十幾個圖檔,在我確定網絡連接配接沒有問題的情況下,每次[queue go]之後總有一兩張圖檔下載下傳失敗,這個問題困擾了我很久,不知道問題出在哪裡。我的queue的配置如下:

  之後經過反複的調試,我發現是setShowAccurateProgress這個方法引起的,如果不配置這個方法,下載下傳過程就不會出錯。但是我的用法是參考了ASIHTTPRequest官方的sample的用法,應該沒有什麼差別(參考:QueueViewController.m)。雖然問題解決了,但是導緻下載下傳失敗的根本原因沒有搞清楚,回頭再看看源碼,找到問題的根源再來更新。

  之前用[SSZipArchive unzipFileAtPath:targetPath toDestination:destinationPath]的時候如果目标路徑不存在會自動建立,想當然的以為ASIHTTPRequest的setDownloadDestinationPath方法也回自動建立,事實證明這種想法是錯誤的,如果目标路徑不存在會導緻request失敗。解決方法是在 設定之前先判斷目标路徑是否存在,不存在就手動建立好,參見如下代碼:

  用ASIHTTPRequest下載下傳檔案時,如果請求的檔案不存在,并不會觸發requestFailed,它會下載下傳一個描述錯誤的文本檔案儲存到目标路徑,用文本編輯器打開後如下所示:

ASIHTTPRequest使用過程中遇到的問題及解決辦法轉之薄桜の霊

  這個檔案描述的是404錯誤,這種情況下怎麼判斷我下載下傳的檔案是否是我真正要下載下傳的呢,解決方法是在setRequestDidFinishSelector指定的selector中加入404狀态的判斷,代碼如下:

  注:其中converFetchComplete為我指定的setRequestDidFinishSelector。

  關于這一點,ASIHTTPRequest的官方文檔中有提到一些:Requests don’t retain their delegates, so if there’s a chance your delegate may be deallocated while your request is running, it is vital that you clear the request’s delegate properties. In most circumstances, if your delegate is going to be deallocated, you probably also want to cancel request, since you no longer care about the request’s status.

  官方給出的代碼示例如下:

  這裡隻說明了request回收的問題,如果是ASINetworkQueue的話也存在同樣的記憶體回收的問題,解決方法如下:

  以上為我最近在使用ASIHTTPRequest時遇到的問題,以後再碰到ASIHTTPRequest相關的問題我會不斷在此更新。