URLSession 没有返回位置数据(session:downloadTask:didFinishDownloadingToURL 位置)

Posted

技术标签:

【中文标题】URLSession 没有返回位置数据(session:downloadTask:didFinishDownloadingToURL 位置)【英文标题】:No data in location returned from URLSession(session:downloadTask:didFinishDownloadingToURL location) 【发布时间】:2015-10-22 18:00:54 【问题描述】:

我正在使用标准后台会话来处理后台提取。操作开始正常并回调:

URLSession(session:downloadTask:didFinishDownloadingToURL location)

经常被调用,但是当我检查位置 url 的内容时,我发现 nil。我检查了正在处理的 url,它是好的,当在浏览器上提交时正确返回数据。可能是什么?我知道我需要复制临时缓存中的数据,但是当它应该仍然存在时,我立即检查了它的内容。这是我的代码:

let span:Float=0.005
func handleRemoteFetch(completionHandler: ((UIBackgroundFetchResult) -> Void)?)
    fetchCompletion=completionHandler;
    fetchInitiation=[unowned self] in
        let theRequest=mapDelegate.sharedMapDelegate().requestForRefreshAndLocation(self.presentLocation!, span:self.span)
        let task = self.backgroundSession.downloadTaskWithRequest(theRequest)
        task.resume()
        print(theRequest.description)
    
    if (presentLocation != nil)
        fetchInitiation!()
        fetchInitiation=nil
    


func URLSession(session: NSURLSession,
    downloadTask: NSURLSessionDownloadTask,
    didFinishDownloadingToURL location: NSURL)
        print(downloadTask.originalRequest!.description)
        let data = NSData(contentsOfURL: location)
        if data != nil 
            let str = String(data:data!, encoding:NSUTF8StringEncoding)
            print(str);
         else 
            print("empty output")
        

【问题讨论】:

【参考方案1】:

当应用在物理设备上执行时,该问题并未出现。一段时间后,它也无缘无故地开始在模拟器上工作。

【讨论】:

只是为了给未来的访问者添加评论,我认为他上面所说的很关键:“当它应该还在时,我立即检查了它的内容。”对我来说,我在 10 次代码后检查 NSURL 的内容,有一半时间它不存在,因为它是一个临时 URL,并且已经从内存中删除。确保在下载完成第一件事后立即获取 NSURL 的内容,以知道它不会返回 nil。

以上是关于URLSession 没有返回位置数据(session:downloadTask:didFinishDownloadingToURL 位置)的主要内容,如果未能解决你的问题,请参考以下文章

Swift从URLSession返回数据

从 URLSession 完成处理函数 Swift 3 返回字符串

自动搜索时快速取消 URLSession

RxSwift之深入解析URLSession的数据请求和数据处理

使用 URLSession 和 ViewModel 检索数据

由于“错误:‘URLSession’类型的值没有成员‘数据’”,将 Vapor 应用程序部署到 Heroku 失败