微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决上载的情况下,最好在`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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?