2017-09-04 121 views
0

我正在使用Xamarin.iOS並實施Downloadmanager。Xamarin.iOS下載管理器

我發現了一個關於如何在swift中實現DownloadManager的教程,由該教程領導,我已經將用swift編寫的邏輯轉錄到C#中。 DownloadManager工作並排隊操作並執行它們。我面臨的唯一問題是應用程序轉換到暫停模式。隊列的行爲不是那麼確定的。有時候,所有排隊的操作都會執行,有時應用會停止執行。

使用案例1: 我開始文件同步並鎖定iPad。大部分時間排隊的操作被執行。但有時當我解鎖iPad時,應用程序將發送到後臺,我必須雙擊主頁按鈕才能返回到應用程序,在這種情況下,文件同步在執行過程中以某種方式停止。

使用案例2:我開始文件同步並將應用程序發送到後臺。像以前的用例一樣。有時會執行所有操作,有時操作會停止。

使用案例3:客戶開始同步並且在他回來一段時間後,iPad無人照看,同步未完成且應用程序在後臺。平均約有70%的同步完成。

對於實現,我使用了「DownloadOperation」作爲元素的「NSOperationQueue」。 「DownloadOperation」只是NSOperation對象的包裝,其執行設置爲「異步」。

可能的問題

  • 我不知道會發生什麼情況「NSOperationQueue」應用程序改變狀態的時候?
  • 「NSOperationQueue」的用法是「正確」的方式去執行DownloadManager嗎?
  • 是否有針對「NSOperationQueue」和/或「的NSOperation」

的執行展望討論的優化任何常見的提示。

P.S.我已啓用「背景模式」和「背景獲取」

+0

我認爲你只需要一個取消觸發器,你可以爲任務做這件事,不確定關於NSOperationQueues。如果可以實現cancallation觸發器,您將知道操作是否停止,以及應用程序重新加載的時間是否能夠相應處理。 – Digitalsa1nt

+0

@ Digitalsa1nt我不想取消操作,我希望它們在應用程序終止後繼續執行。這就是在NSOperations中使用OperationQueue和NSUrlSession的原因。但是,謝謝你的評論我希望有人對此問題有所瞭解。 –

+0

在iOS終止您的應用程序後,您無法讓代碼無限期地運行。或者我應該說這是違反蘋果準則的。希望有人會爲你找到解決辦法。 :) – Digitalsa1nt

回答

0

根據您的描述,我想您使用NSURLConnection來執行不贊成使用的後臺下載。此外,Background Fetch是少量的內容,這將是活躍的投機,這是不適合您的方案:

抓取內容的少量投機

應用程序需要檢查是否有新內容定期可以要求系統將其喚醒,以便他們可以啓動該內容的獲取操作。

所以,你可以切換使用NSURLSession這是正式建議在後臺下載內容。要配置後臺會話,下載過程將繼續進行,以防應用程序被暫停或終止(除非用戶已強制該應用程序)。請參閱本Apple documentation

在後臺

下載內容在下載文件,應用程序應該使用NSURLSession對象,啓動下載,以便系統可以利用下載過程的控制的情況下,該應用程序被暫停或終止。當您爲後臺傳輸配置NSURLSession對象時,系統會在單獨的進程中管理這些傳輸,並以通常的方式將狀態報告回您的應用程序。如果您的應用在傳輸過程中被終止,系統將在後臺繼續傳輸,並在傳輸完成時或者一個或多個任務需要應用關注時啓動您的應用(如適用)。

...

如果任務還沒有完成,系統終止您的應用程序時,系統將自動繼續管理後臺任務。如果用戶終止您的應用程序,系統將取消所有未完成的任務。

關於如何通過NSURLSession創造背景下載管理器,你可以參考一下:

博客與SWIFT:Downloading files in background with URLSessionDownloadTask

Xamarin指導:Walkthrough - Using Background Transfer Service and NSURLSession

我認爲你需要下載多個文件在後臺,這裏有一個很好的指導:Downloading multiple files in batches in iOS

+0

我已經用「NSURLSession」實現了整個Manager。簡而言之,我使用NSOperations創建了一個NSOperationQueue,其中每個操作都有一個由DownloadManager的基本NSURLSession創建的NSURLSessionDownloadTask。 即使應用程序暫停,這應該可以下載多個文件。 我已經使用這篇文章作爲參考 - > [鏈接](https://stackoverflow.com/questions/32322386/how-to-download-multiple-files-sequentially-using-nsurlsession-downloadtask-in-s ) –