2017-05-09 91 views
0

我可以成功地下載在後臺一個zip文件與我的應用程序代碼與IOS 10和迅速3.如何將屬性傳遞給swift 3 urlsession didFinishDownloadingTo在後臺下載後委託?

我使用backgroundsession數據任務:

let backgroundSessionConfiguration = URLSessionConfiguration.background(withIdentifier: (prefix + postfix)) 
     let backgroundSession = Foundation.URLSession(configuration: backgroundSessionConfiguration, delegate: self, delegateQueue: OperationQueue.main) 

     var request = URLRequest(url: dlUrl) 
     request.httpMethod = "GET" 
     request.cachePolicy = NSMutableURLRequest.CachePolicy.reloadIgnoringCacheData 

     let task = backgroundSession.downloadTask(with: request) 

     task.resume() 

但是我不知道什麼是傳遞最佳實踐在下載後委託方法的一些具體的元數據完成:

func urlSession(_ session: URLSession, 
    downloadTask: URLSessionDownloadTask, 
    didFinishDownloadingTo location: URL){ 

我需要這個代表裏面關於下載取決於例如一些信息根據用戶之前做出的選擇。我無法從服務器或網址獲取這些數據。

所以我想有一個變量或字典downloadType告訴我做什麼用的已完成的下載,能有這樣的事情在委託

if downloadType == "normal" ... do this 
else ... do that 

我不知道我是否可以安全地使用性質應用程序暫停時實現URLSessionDownloadDelegate協議的類的類? 當應用程序被掛起時下載完成時,類實例本身是否會恢復,或者ios是否會創建類的新實例?

那麼這將會一直工作:

class ServerCom: NSObject, URLSessionDownloadDelegate { 
    var updateTypeStr = "" 
    [...] 
    func somePublic(setUpdateType: String) { 
    self.updateTypeStr = setUpdateType 

    [...] 
    func urlSession(_ session: URLSession, 
    downloadTask: URLSessionDownloadTask, 
    didFinishDownloadingTo location: URL){ 
    [...] 

     if(self.updateTypeStr == "normal") { // do this 
     else { // do that 

是否有該用例一些更好的方法?

在此先感謝!

回答

1

當下載完成時,應用程序被暫停或將創建類的新實例時,類實例本身是否會恢復?

您有責任自行保存和恢復。

當守護程序完成您的後臺請求時,您的應用程序可能會在干預期間完全終止(例如,已被暫停,可能會由於內存壓力而被拋棄),因此您必須能夠將任何相關信息保存到持久存儲並且能夠在應用程序重新啓動時從存儲中加載。

使用後臺會話測試應用程序時,我發現有代碼調用exit(0)來終止應用程序很有用。您從不在生產應用程序中執行此操作,但在測試應用程序重新創建必要對象時,如果在後臺請求完成時重新啓動應用程序,則它很有用。關鍵是,在進行此測試時,不應嘗試使用「雙擊主頁按鈕並向上滑動」殺死應用程序,因爲這樣做在設計上也會取消後臺請求。您想要測試應用程序已通過正常應用程序生命週期終止的情況,並且在完成後臺請求後已由網絡後臺程序重新啓動。

相關問題