Вопрос старен, но все еще остается без ответа, так что вот одно решение.
Некоторые пояснения первые
В общем есть свойство 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");
}
}
Очень простой пример ...
но если я скачаю что-то большое, что не получится. время загрузки в зависимости от размера файла и скорости интернета –
Хм, интересно, почему вы не получаете 'NSURLErrorNetworkConnectionLost', когда теряете соединение? –
Я добавляю func URLSession (сессия: NSURLSession, задача: NSURLSessionTask, didCompleteWithError error: NSError?) и func URLSession (сеанс: NSURLSession, didBecomeInvalidWithError error: NSError?) но. когда я потерял связь, они не называются –