2016-03-21 38 views
0
我在與處理問題「沒有空間」在iOS /「全磁盤」錯誤與NSURLSessionDownloadTask

NSURLSessionDownloadTask

如果磁盤已滿

由於應用我做下載問題與存儲幾乎滿盤的警告接到一個電話到

URLSession(會話:NSURLSession,任務:NSURLSessionTask,didCompleteWithError錯誤:NSError)

與具有域誤差NSPOSIXErrorDomain和錯誤代碼ENOSPC

但這只是例如,如果我有3個任務正在運行,我只能得到其中一個任務,另外2個任務仍處於運行狀態 他們沒有收到任何任務字節,但它們也不會失敗。 另外,調用任何這些任務的取消將其狀態從「正在運行」更改爲「正在取消」,並且它們將無限期地保持不變。

我的解決方案是,當我第一次收到此錯誤時,爲會話調用invalidateAndCancel並處理所有正在運行的任務失敗。 當「完整磁盤」是由應用程序下載引起的時,這似乎工作。 但是,如果「完整磁盤」錯誤是由外部下載造成的(例如:iTunes文件共享,下載播客,其他應用程序下載)我在應用程序中沒有收到任何錯誤 我所有的下載任務保持在運行或取消(如果我嘗試取消它們) 他們不下載任何東西,他們沒有失敗,任何的回調NSURLSessionDelegate或NSURLSessionDownloadDelegate

的開始下載之前,我檢查設備 提供的可用空間,我也考慮到目前運行任務 但我無法控制設備上可能最終觸發「全盤」警告的其他下載內容

我該如何處理這些情況? 下載任務是否預計將保持運行狀態,雖然他們不再下載? 對於每個任務或至少該會話,我不應該使用(NSPOSIXErrorDomain,ENOSPC)調用didCompleteWithError調用嗎? 或者至少我不應該能夠成功取消它們?並且無論如何得到一個didCompleteWithError調用?

是否有一個委託電話我想念,讓我知道是時候關閉所有正在運行的任務?

我使用一個共享的背景會話更多的後臺下載任務

下載任務與NSURLSession的創建: FUNC downloadTaskWithRequest(_要求:的NSURLRequest) - > NSURLSessionDownloadTask

,創建使sesion配置使用NSURLSessionConfiguration的: class func backgroundSessionConfigurationWithIdentifier(_ identifier:String) - > NSURLSessionConfiguration

使用NSURLSession的 init(配置配置:NSURLSessionConfiguration, 委託委託:NSURLSessionDelegate ?, delegateQueue隊列:NSOperationQueue?)

我使用一個NSOperationQueue以3 我已經實現了我的NSURLSessionDelegate和NSURLSessionDownloadDelegate

任務maxConcurrentOperationCount似乎運行前景和背景的罰款。

感謝

PS:使用Xocde7,ios9 SDK,一個ios9設備上測試

回答

-1

我還要求蘋果公司關於這個問題,答案回來:

好像,因爲背景會話使用磁盤來保持其狀態,當磁盤已滿時的行爲並不完全可靠以返回ENOSPC

並且開發人員現在負責處理完整磁盤情況:

  • 檢查磁盤空間您開始下載時,您的應用程序下載

  • 監控磁盤空間之前 - 如果您的應用程序是在前臺,或您的應用程序獲取後臺恢復(或重新啓動),主動監視可用的磁盤空間。如果它低於某個閾值,請暫停下載(通過調用-cancelByProducingResumeData:,以便稍後恢復)。

的詳細解答檢查: https://forums.developer.apple.com/thread/43263

相關問題