问题是旧的,但仍然没有答案,所以这里有一个解决方法。
一些澄清第一
一般有一个叫waitsForConnectivity
的URLSessionConfiguration
一个属性,它可以设置为false
其中URLSessionTask
随后将直接连接丢失失败。但是,如果true
,然后URLSessionTaskDelegate
将收到urlSession(_:taskIsWaitingForConnectivity:)
方法的回调。
然而
后台任务,例如DownloadTask
总是等待连接,而忽略的URLSessionConfiguration
waitsForConnectivity
财产。他们也不要触发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(session:NSURLSession,task:NSURLSessionTask,didCompleteWithError error:NSError?) 和 func URLSession(session:NSURLSession,didBecomeInvalidWithError error:NSError?) but。当我失去联系时,他们不会被叫到 –