Ios 上传时调用“handleEventsForBackgroundURLSession”中收到的“completionHandler”的最佳位置?

Ios 上传时调用“handleEventsForBackgroundURLSession”中收到的“completionHandler”的最佳位置?,ios,swift,nsurlsessionuploadtask,nsurlsessionconfiguration,Ios,Swift,Nsurlsessionuploadtask,Nsurlsessionconfiguration,我正在使用URLSessionConfiguration.background上载和下载内容,而我的应用程序不是前台。我用于创建后台会话的代码如下所示: private-var会话:URLSession! 私有重写init(){ super.init() let config=URLSessionConfiguration.background(带标识符:Constants.BackgroundSessionIdentifier) config.sessionSendsLaunchEvents=

我正在使用
URLSessionConfiguration.background
上载和下载内容,而我的应用程序不是前台。我用于创建后台会话的代码如下所示:

private-var会话:URLSession!
私有重写init(){
super.init()
let config=URLSessionConfiguration.background(带标识符:Constants.BackgroundSessionIdentifier)
config.sessionSendsLaunchEvents=true
session=URLSession(配置:config,委托:self,委托队列:nil)
}
在applicationdelegate中,我接收到一个完成处理程序,并将其存储为UploadDownloadService的一个属性,UploadDownloadService是一个单例

func应用程序(application:UIApplication,handleEventsForBackgroundURLSession标识符:String,completionHandler:@escaping()->Void){
Logger.debug(#函数)
UploadDownloadService.shared.backgroundCompletionHandler=completionHandler
}
我正在以apple的身份在
urlsessiondifinishevents
中执行完成处理程序。我的代码如下:

func URLSessiondFinishEvents(用于背景URLSession会话:URLSession){
Logger.debug(#函数)
委托?.urlsessiondFinisheventCalled()
DispatchQueue.main.async{
[虚弱的自我]在
guard let backgroundCompletionHandler=self?.backgroundCompletionHandler-else{
返回
}
debug(“正在执行后台完成处理程序”)
backgroundCompletionHandler()
self?.backgroundCompletionHandler=nil
self?.delegate?.didCallBackgroundCompletionHandler()
}
}
现在我发现的是
urlSession(\usession:,downloadTask:,didfishdownloadingto location:)
urlsessiondifinishevents
之前被调用,所以我确信在调用
urlsessiondifinishevents
中的完成处理程序之前,我下载的文件会保存到一个永久位置

但我对上传案例感到困惑。我没有找到在
urlsessiondifinishevents
方法之前调用的任何委托方法。当应用程序处于唤醒状态时,我找到的唯一用于上载的委托方法是
urlSession(u.session:,task:,didpleteWitherRor:)
。在
urlsessiondFinishEvents
之后调用

现在在这个场景中,我想到了两个问题

1.我应该从哪里调用完成处理程序,以确保上传后所有的后处理都已完成(在本例中,我希望查询数据库、更新并发送消息。我正在构建聊天应用程序)?在我进行处理并从
urlsessiondifinishevents
方法外部调用时,可以延迟完成处理程序调用吗? 2.在我调用完成处理程序后,大约有多少时间? 注意:在发布之前,我在谷歌上做了很多搜索,发现了一个相关的问题。但那篇帖子上唯一的答案(到目前为止)并没有回答我的问题。所以我决定在这里详细地问这个问题(描述我的场景)。