2016-02-11 3 views
2

Я фон загрузка архива:Как справиться с фоном?

if let url = NSURL(string: urlstring) 
     {    
      let config = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier((NSUUID().UUIDString)) 
      let session = NSURLSession(configuration: config, delegate: self, delegateQueue: nil) 
      let task = session.downloadTaskWithURL(url) 
      session.sessionDescription = filepath 
      if let sessionId = session.configuration.identifier 
      { 
       print("start zip session: " + sessionId) 
      } 

      task.resume()    
      } 
     } 

это работает здорово, если у вас есть подключение к Интернету, но если вы потеряете его во время загрузки приложения просто ждать и URLSession (сессия: NSURLSession, задача: NSURLSessionTask, didCompleteWithError ошибка: NSError?) не будет называться никогда. Как это можно сделать?
Нечто подобное время ответа от сервера

ответ

0

Вы можете установить время ожидания для запросов:

config.timeoutIntervalForRequest = <desired value> 
config.timeoutIntervalForResource = <desired value> 

Документация:

+0

но если я скачаю что-то большое, что не получится. время загрузки в зависимости от размера файла и скорости интернета –

+0

Хм, интересно, почему вы не получаете 'NSURLErrorNetworkConnectionLost', когда теряете соединение? –

+0

Я добавляю func URLSession (сессия: NSURLSession, задача: NSURLSessionTask, didCompleteWithError error: NSError?) и func URLSession (сеанс: NSURLSession, didBecomeInvalidWithError error: NSError?) но. когда я потерял связь, они не называются –

0

Вопрос старен, но все еще остается без ответа, так что вот одно решение.

Некоторые пояснения первые

В общем есть свойство URLSessionConfiguration называется waitsForConnectivity, который может быть установлен в false где URLSessionTask будет напрямую терпеть неудачу на связи потерянной. Однако если true, то получит обратный вызов по методу urlSession(_:taskIsWaitingForConnectivity:).

Однако

Фоновые задачи, такие как DownloadTask всегда ждать подключения и игнорировать waitsForConnectivity свойство URLSessionConfiguration. Они также вызвали ответный звонок DO urlSession(_:taskIsWaitingForConnectivity:), поэтому нет официального способа прослушивания выпадающего списка при загрузке.

Обход

Если вы слушаете для процесса загрузки вы заметите, что вызов метода выполняется несколько раз в секунду. Поэтому мы можем заключить, что если обратный вызов прогресса не вызывается более 5 секунд, может возникнуть проблема с возможностью подключения. Поэтому обходным путем является предоставление дополнительного свойства делегату URLSessionDownloadDelegate и сохранение последнего обновления прогресса. Затем используйте функцию интервалов, чтобы периодически проверять, не скоро ли было обновлено это свойство.

Что-то вроде:

class Downloader: NSObject, URLSessionTaskDelegate, URLSessionDownloadDelegate { 

     var lastUpdate: Date; 
     var downloadTask: URLSessionDownloadTask?; 

     public var session : URLSession { 
      get { 
       let config = URLSessionConfiguration.background(
       withIdentifier: "\(Bundle.main.bundleIdentifier!).downloader"); 
       config.isDiscretionary = true; 

       return URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue()); 
      } 
     } 

     override init() { 
      self.lastUpdate = Date(); 
      super.init(); 
     } 

     func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { 
      // Handle download completition 
      // ... 
     } 

     func urlSession(
      _ session: URLSession, 
      downloadTask: URLSessionDownloadTask, 
      didWriteData bytesWritten: Int64, 
      totalBytesWritten writ: Int64, 
      totalBytesExpectedToWrite exp: Int64) 
     { 
      let progress = 100 * writ/exp; 
      // Do something with the progress 
      // ... 

      self.lastUpdate = Date(); 
     } 
    } 

    var downloader = Downloader(); 
    let url = "http://..."; 
    var request = URLRequest(url: URL(string: url)!); 
    currentWorker.downloadTask = downloader.session.downloadTask(with: request); 
    currentWorker.downloadTask!.resume(); 

    // Schedule timer for every 5 secs 
    var timer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "CheckInternetDrop", userInfo: nil, repeats: true); 

func CheckInternetDrop(){ 
    let interval = Date().timeIntervalSinceDate(downloader.lastUpdate); 
    if (interval > 5) { 
     print("connection dropped"); 
    } 
} 

Очень простой пример ...

Смежные вопросы