如何将属性传递给swift 3 urlsession didFinishDownloadingTo后台下载后委托?

时间:2017-05-09 21:39:12

标签: ios swift swift3 background urlsession

我可以使用ios 10和swift 3的应用程序代码在后台成功下载zip文件。

我使用backgroundsession数据任务:

snapshot.forEach((child) => {
                    console.log(child.val());
                    trainingSets.push(child.val());
                });

但我想知道在下载完成后将一些特定元数据传递给委托方法的最佳做法是什么:

let backgroundSessionConfiguration = URLSessionConfiguration.background(withIdentifier: (prefix + postfix))
        let backgroundSession = Foundation.URLSession(configuration: backgroundSessionConfiguration, delegate: self, delegateQueue: OperationQueue.main)

        var request = URLRequest(url: dlUrl )
        request.httpMethod = "GET"
        request.cachePolicy = NSMutableURLRequest.CachePolicy.reloadIgnoringCacheData

        let task = backgroundSession.downloadTask(with: request)

        task.resume()

我需要在此代理中包含有关该下载的一些信息,例如,关于用户之前做出的选择。我无法从服务器或网址获取此数据。

所以我想有一个变量或字典downloadType告诉我如何处理完成的下载,在委托中有这样的东西

    func urlSession(_ session: URLSession,
    downloadTask: URLSessionDownloadTask,
    didFinishDownloadingTo location: URL){

我不确定在应用程序暂停时是否可以安全地使用实现URLSessionDownloadDelegate协议的类的属性? 当应用程序暂停时,下载完成后是否会恢复类实例本身,或者ios是否会创建该类的新实例?

所以这总是有用的:

if downloadType == "normal" ... do this
else ... do that

该用例是否有更好的方法?

提前感谢!

1 个答案:

答案 0 :(得分:1)

  

当应用程序暂停时,下载完成后是否会恢复类实例本身,或者ios是否会创建该类的新实例?

您有责任自行保存和恢复。

当守护程序完成您的后台请求时,您的应用程序可能会被完全终止(例如,因为内存压力而被暂停,可能会因内存压力而被丢弃),因此您必须能够将任何相关信息保存到持久性存储并且能够在应用重新启动时从存储中加载它。

在使用后台会话测试应用时,我发现让代码调用<?php list_tax_of_project(); ?> function list_tax_of_project($id = '', $title = '', $taxonomy = 'project_category', $class = '') { $class = 'list-categories'; if ($class = 'skill') $class = 'list-skill'; $terms = get_the_terms($id, $taxonomy); if ($terms && !is_wp_error($terms)): ?> <h3 class="title-content"><?php printf($title); ?></h3> <div class="list-require-skill-project list-taxonomires list-<?php echo $taxonomy; ?>"> <?php the_taxonomy_list($taxonomy, '<span class="skill-name-profile">', '</span>', $class); ?> </div> <?php endif; } 来终止应用非常有用。您永远不会在生产应用程序中执行此操作,但在测试应用程序在后台请求完成时重新启动应用程序时重新创建必要对象的能力时,它非常有用。关键点是,在进行此测试时,不应尝试使用“双击主页按钮并向上滑动”来杀死应用程序,因为这样做也会取消后台请求。您希望测试应用程序在正常的应用程序生命周期中终止的情况,并在后台请求完成后由网络守护程序重新启动。