Ios Swift:当其他URLSession被初始化时,如何去初始化URLSession?

Ios Swift:当其他URLSession被初始化时,如何去初始化URLSession?,ios,swift,nsurlsessiondatatask,nsurlsessionuploadtask,Ios,Swift,Nsurlsessiondatatask,Nsurlsessionuploadtask,我有一个URLSessionDataDelegate将图片上传到服务器,以下是其中的一部分 当我选择要上载的图像时,URLSession会立即初始化 但是,如果用户点击上传按钮,并且没有互联网连接,我会将图像保存在Realm中,并在下次应用启动时上传 为了上传保存的图像,我创建了另一个名为OfflinePictureUploadClass的类,其代码几乎相同 如果该应用已通过滑动终止该应用而退出,然后再次启动,则它正在执行脱机PictureUploadClass的正确URLSessionData

我有一个
URLSessionDataDelegate
将图片上传到服务器,以下是其中的一部分

当我选择要上载的图像时,
URLSession
会立即初始化

但是,如果用户点击
上传
按钮,并且
没有互联网连接
,我会将图像保存在Realm中,并在下次应用启动时上传

为了上传保存的图像,我创建了另一个名为
OfflinePictureUploadClass
的类,其代码几乎相同

如果该应用已通过滑动终止该应用而退出,然后再次启动,则它正在执行
脱机PictureUploadClass
的正确
URLSessionDataDelegate
方法。因此,在这种情况下没有问题

但是,如果应用程序在未完全关闭的情况下正常重新启动,则它正在执行main
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)
} 

这背后的基本思想是,您的程序支持后台模式,因此您需要正确地支持您的连接。您知道,在后台运行一段时间后,程序将进入挂起模式。因此,每当你的应用程序进入后台时,你都可以向系统请求额外的时间,并检查应用程序必须在后台运行多长时间才能完成或关闭所有连接。检查以下方法:


问题是,当你的应用程序在挂起后唤醒时,它会从停止的同一点继续运行。因此,您可能会遇到各种错误,例如会话或连接超时。

谢谢。我尽量把我的问题弄清楚。选择图像后,将初始化PictureUpload类。下一个屏幕,当用户点击“上载internet”按钮时,会选中该选项,如果没有连接,则会保存图像,并在连接后上载。问题是当应用程序被移动到后台且未完全关闭时。如果Internet处于活动状态并且重新启动了应用程序,它将执行PictureUpload的委托方法。它从执行OfflinePictureUpload类开始,然后当它必须执行委托时,它转移到PictureUpload类。非常感谢。我已经设法做到了。我已经更改了背景标识符。我刚刚注意到两个URLTasks具有相同的背景标识符。所以,我改变了标识符。