- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力理解我认为很容易的东西。
我有一个 URLSession.downloadTask。我已将我的下载对象设置为 URLSession 委托(delegate),并且以下委托(delegate)方法会接收调用,因此我知道我的委托(delegate)设置正确。
func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?)
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL)
我无法捕获的情况是 downloadTask 填满了 iPad 上的磁盘空间。这些委托(delegate)方法都不会被调用。
我应该如何捕捉这个错误?
这是我的下载对象:
import Foundation
import Zip
import SwiftyUserDefaults
extension DownloadArchiveTask: URLSessionDownloadDelegate {
// Updates progress info
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask,
didWriteData bytesWritten: Int64, totalBytesWritten: Int64,
totalBytesExpectedToWrite: Int64) {
let progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
self.delegate?.updateProgress(param: progress)
}
// Stores downloaded file
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
print("DownloadArchiveTask: In didFinishDownloadingTo")
}
}
extension DownloadArchiveTask: URLSessionTaskDelegate {
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
print("DownloadArchiveTask: In didCompleteWithError")
if error != nil {
print("DownloadArchiveTask: has error")
self.delegate?.hasDiskSpaceIssue()
}
}
}
extension DownloadArchiveTask: URLSessionDelegate {
// Background task handling
func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
print("DownloadArchiveTask: In handler for downloading archive")
DispatchQueue.main.async {
let sessionIdentifier = session.configuration.identifier
if let sessionId = sessionIdentifier, let app = UIApplication.shared.delegate as? AppDelegate, let handler = app.completionHandlers.removeValue(forKey: sessionId) {
handler()
}
}
}
func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) {
print("DownloadArchiveTask: didBecomeInvalidWithError")
if error != nil {
print("DownloadArchiveTask: has error")
self.delegate?.hasDiskSpaceIssue()
}
}
}
class DownloadArchiveTask: NSObject {
var delegate: UIProgressDelegate?
var archiveUrl:String = "http://someurl.com/archive.zip"
var task: URLSessionDownloadTask?
static var shared = DownloadArchiveTask()
// Create downloadsSession here, to set self as delegate
lazy var session: URLSession = {
let configuration = URLSessionConfiguration.background(withIdentifier: "\(Bundle.main.bundleIdentifier!).background_archive")
return URLSession(configuration: configuration, delegate: self, delegateQueue: nil)
}()
func initialDownload() {
// Create URL to the source file you want to download
let fileURL = URL(string: archiveUrl)
let request = URLRequest(url:fileURL!)
self.task = self.session.downloadTask(with: request)
task?.resume()
}
}
有人做过吗?我不敢相信这么难 - 我一定是在以错误的方式解决问题......
最佳答案
不久前我不得不为我的公司解决这个问题。现在我的解决方案是在 Objective C 中,因此您必须将它转换为 Swift,这应该不难。我创建了一个方法来获取设备上剩余的可用存储空间,然后根据我们正在下载的文件的大小检查它。我的解决方案假定您知道下载文件的大小,在您的情况下,您可以在 didWriteData
方法中使用 totalBytesExpectedToWrite
参数。
这是我做的:
+ (unsigned long long)availableStorage
{
unsigned long long totalFreeSpace = 0;
NSError* error = nil;
NSArray* paths = NSSearchPathForDirectoriesInDomain(NSDocumentDirectory, NSUserDomainMask, YES);
NSDictionary* dictionary = [[NSFileManager defaultManager] attributesOfFileSystemForPath:[paths lastObject] error:&error];
if (dictionary)
{
NSNumber* freeFileSystemSizeInBytes = [dictionary objectForKey:NSFileSystemFreeSize];
totalFreeSpace = [freeFileSystemSizeInBytes unsignedLongLongValue];
}
return totalFreeSpace;
}
请确保为这些数字留出一些错误空间,因为 iTunes、设备上的设置应用程序和此数字永远不会匹配。我们在这里得到的数字是三者中最小的,以 MB 为单位。我希望这对您有所帮助,如果您需要帮助将其转换为 Swift,请告诉我。
关于ios - Swift:如何在后台 URLSession.downloadTask 上捕获磁盘已满错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55304446/
共享 URLSession 和默认配置的 URLSession 有什么区别? 在我的应用程序中,我使用 URLSession.shared 向服务器发送请求。现在我尝试将其更改为 URLSession
我有一个URLSessionDataDelegate来将图片上传到服务器,以下是其中的一部分。 当我选择要上传的图像时,URLSession 会立即初始化。 但是,如果用户点击上传按钮并且没有互联网连
Swift 5 引入了新的 Result 类型来处理异步函数的结果。我想知道如何将这种新的结果类型用于 URLSession。 I have this following code. func get
在后台 session 中,对于使用 https 的应用<>服务器通信,以下方法的相当轻松的实现有什么区别,或根本没有 ? func urlSession(_ session: URLSessio
我正在尝试使用 Swift 向带有一些 JSON 数据的 php 脚本发出 POST 请求。当我运行以下代码时,我的应用程序崩溃并且没有信息记录到控制台。 if let jsonData = try?
我有一个用于对服务器进行身份验证的客户端代码(已实现服务器,以便在成功时我收到重定向网址),并且想要检查状态代码是否为 302。但是请求会自动重定向,响应结果是200。那么问题是如何防止自动重定向?
我正在对 URLSession 使用方法调配,下面是我的调配方法。我不确定为什么应用程序在执行 @escaping 的完成处理程序时在目标应用程序中崩溃。请帮助我。 @objc func mytest
使用 URLSessionDownloadTask。有没有办法使用委托(delegate) didwritedata 获取多个文件下载的总体进度?在一个 我有所有文件的预期大小,现在我需要所有当前任务
我刚刚遇到的事情完全改变了我对 iOS 中 URLSession 缓存的印象。 我们正在触及一个只被触及过一次的端点。 重新启动应用程序不会再次到达端点。 删除应用会导致它再次到达端点...但只有一次
我正在使用 URLSession 和一项名为 Backendless 的服务。 Backendless 与 Parse 非常相似。 Backendless 有一个消息服务,可以让你发送电子邮件。我在我
我已经使用适合 URLSession 完整回调签名的方法定义了自己的类,例如。 G。 (数据?、响应?、错误?)-> 无效。该方法包含用于处理响应的通用逻辑,例如。 G。检查数据,解析数据等现在我想对
我正在尝试使用一段在 Xcode playground 文件中工作的代码从本地服务器获取一些数据: URLSession.shared.dataTask(with: url!, comp
我正在使用一个实际上是为 swift 2 编写的函数。我已经为 swift 3 做了调整。但我不断收到错误: URLSession' produces '()', not the expected c
我正在尝试在我的 iOS 应用程序中与我公司的 API 进行通信。我使用的是标准 URLSession。 API 会自动负载平衡并重定向到不同的服务器,因此我实现了处理重定向的 URLSessionD
为每个网络请求创建一个新的 URLSession 是否会占用大量资源? 一些背景: 我正在开发一个用于发出网络请求的库。我正在尝试添加一项功能,允许将结果下载到一个文件中,该文件也会报告其进度。为此,
我目前正在使用基于此教程的代码 http://sweettutos.com/2015/11/06/networking-in-swift-how-to-download-a-file-with-nsu
我有一个从 viewDidLoad 触发的 URLSession。它返回包含图像 URL 的 JSON。因此,为了获得该图像,我从第一个 URLSession 的完成 block 调用的 JSON 解
尝试使用 Swift jSon 解码器解析 json 时出现类型不匹配错误。 我只是找不到正常解析它的方法。 错误: typeMismatch(Swift.String, Swift.Decoding
我正在查看一个用 Swift 4 编写的 iOS 应用程序。它有一个使用 URLSession 的相当简单的网络层,但是该应用程序没有单元测试,在我开始重构之前,我很想通过引入一些来解决这个问题测试。
我正在使用 URLSession 和 downloadTask 在前台下载文件。下载比预期慢得多。我发现的其他帖子解决了后台任务的问题。 let config = URLSessionConfigur
我是一名优秀的程序员,十分优秀!