我有一个将图片上传到服务器URLSessionDataDelegate
,以下是其中的一部分。
当我选择要上传的图像时,URLSession
会立即初始化。
但是,如果用户点击Upload
按钮并且有no internet connection
,我将图像保存在 Realm 中,并在下次启动应用程序时上传。
为了上传保存的图像,我创建了另一个名为OfflinePictureUploadClass
几乎相同代码的类。
如果应用程序已通过滑动终止应用程序退出,然后再次启动,则它正在执行正确的URLSessionDataDelegate
OfflinePictureUploadClass
方法。因此,在这种情况下没有问题。
但是,如果应用程序在没有完全关闭的情况下正常重新启动,则它正在执行主PictureUpload
类的委托方法,然后上传失败。
那么,我该如何克服这个问题,如何取消初始化URLSessionDataDelegate
,这是在选择图像时初始化的。
下面的代码只是为了显示选择图像时初始化的内容。
fileprivate var DefaultSession: Foundation.URLSession!
fileprivate var BackgroundSession: Foundation.URLSession!
override init() {
super.init()
// default session to fetch
let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = 20
DefaultSession = Foundation.URLSession(configuration: config, delegate: nil, delegateQueue: .main)
// background session
let backgroundConfiguration = "com.xxx.backgroundconfiguration.upload"
let configuration = URLSessionConfiguration.background(withIdentifier: backgroundConfiguration)
BackgroundSession = Foundation.URLSession(configuration: configuration, delegate: self, delegateQueue: .main)
}
这背后的基本思想是你的程序支持后台模式,所以你需要正确支持你的连接。您知道在后台运行一段时间后,程序将进入挂起模式。因此,每当应用进入后台时,您都可以向系统请求额外的时间,并检查应用必须在后台运行以完成或关闭所有连接的时间。检查以下方法:
beginBackgroundTask(withName:expirationHandler:)
背景剩余时间
问题是,当您的应用在挂起后唤醒时,它会从停止的同一点继续。因此,您可能会遇到各种错误,例如会话或连接超时。