問題是舊的,但仍然沒有答案,所以這裏有一個解決方法。
一些澄清第一
一般有一個叫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。當我失去聯繫時,他們不會被叫到 –