上载的情况下,最好在`handleEventsForBackgroundURLSession`中调用`completionHandler`的最佳位置? 1我应该从哪里调用完成处理程序,以确保所有的后处理都在上传后完成在这种情况下,我想查询数据库,更新并发送消息我正在构建一个聊天应用程序?在我执行处理并从urlSessionDidFinishEvents方法外部调用它时,可以延迟完成处理程序调用吗? 2调用完成处理程序后,大约能获得多少时间?注意:我在发布之前做了很多谷歌搜

问题描述

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

    private var session: URLSession!
    private override init() {
        super.init()

        let config = URLSessionConfiguration.background(withIdentifier: Constants.backgroundSessionIdentifer)
        config.sessionSendsLaunchEvents = true
        session = URLSession(configuration: config,delegate: self,delegateQueue: nil)
    }

在应用程序委托中,我收到一个完成处理程序并将其存储为Singleton的UploadDownloadService属性

    func application(_ application: UIApplication,handleEventsForBackgroundURLSession identifier: String,completionHandler: @escaping () -> Void) {

        Logger.debug(#function)
        UploadDownloadService.shared.backgroundCompletionHandler = completionHandler
    }

我正在urlSessionDidFinishEvents中以苹果demonstrated的身份执行处理程序。我的代码如下:

    func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {

        Logger.debug(#function)

        delegate?.urlSessionDidFinishEventsCalled()
        dispatchQueue.main.async {
            [weak self] in
            guard let backgroundCompletionHandler = self?.backgroundCompletionHandler else {
                return
            }

            Logger.debug("Executing background completion handler.")
            backgroundCompletionHandler()
            self?.backgroundCompletionHandler = nil
            self?.delegate?.didCallBackgroundCompletionHandler()
        }
    }

现在在urlSession(_ session:,downloadTask:,didFinishDownloadingTo location:)之前调用了我发现的urlSessionDidFinishEvents,因此在我在urlSessionDidFinishEvents调用完成处理程序之前,我确定已下载的文件已保存到一个永久位置。

但是我对上传案例感到困惑。我找不到在urlSessionDidFinishEvents方法之前调用的任何委托方法。应用唤醒时,我找到的唯一用于上载的委托方法urlSession(_ session:,task:,didCompleteWithError:)。在urlSessionDidFinishEvents之后调用

现在在这种情况下,我要记住两个问题。

1。我应该从哪里调用完成处理程序,以确保所有的后处理都在上传后完成(在这种情况下,我想查询数据库,更新并发送消息。我正在构建一个聊天应用程序)?在我执行处理并从urlSessionDidFinishEvents方法外部调用它时,可以延迟完成处理程序调用吗?

2。调用完成处理程序后,大约能获得多少时间?

注意:我在发布之前做了很多谷歌搜索,发现了一个相关的问题here。但是,该帖子的唯一答案(截至目前)仍无法回答我的问题。因此,我决定在这里详细说明这个问题(描述我的情况)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...