gpt4 book ai didi

ios - 将 URLSessionDownloadTask 存储在 Core Data 中

转载 作者:行者123 更新时间:2023-11-28 15:35:37 25 4
gpt4 key购买 nike

当应用程序处于关闭状态或我的下载状态发生变化时,例如从等待状态到下载状态或完成状态,我想在核心数据中保存 URLSessionDownloadTask

我的自定义类的所有其他属性都完美存储,但应用程序在存储下载任务时崩溃。

崩溃的原因是

[__NSCFLocalDownloadTask encodeWithCoder:]: unrecognized selector sent to instance 0x7ff189f181c0 -[NSKeyedArchiver dealloc]: warning: NSKeyedArchiver deallocated without having had -finishEncoding called on it. Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFLocalDownloadTask encodeWithCoder:]: unrecognized selector sent to instance 0x7ff189f181c0'

这是我的类(class)

class VideoDownloadModel : NSManagedObject {

@NSManaged var videoID : NSNumber?
@NSManaged var vid : Video?
@NSManaged var downloadTask : URLSessionDownloadTask?
@NSManaged var downloadStatus : String?
}

这样存储

    let request = NSFetchRequest<NSFetchRequestResult>(entityName: (COREDATA_ENTITY_Description?.name)!)
request.returnsObjectsAsFaults = false
request.predicate = NSPredicate(format: "videoID == %@", videoModel.videoID!)

do {
let result = try COREDATA_CONTEXT.fetch(request)
print(result)
var vidArr = result as! [VideoDownloadModel]

if vidArr.count != 0 {
vidArr[0] = videoModel

COREDATA_MANAGER.saveContext()
}

} catch {
let fetchError = error as NSError
print(fetchError)
}

URLSessionDownlaodTasknil 时,它工作正常,但是当任何下载开始时,它在保存时崩溃。

场景:

  • 我使用所有属性初始化了我的自定义类对象,但将任务设置为 nil。

  • 我将该对象存储在它完美保存的核心数据中。

  • 我初始化了那个对象的任务,下载工作完美。

  • 然后我更新核心数据中的对象,同时更新应用程序崩溃,因为 URLSssionTask 不是从 NSCoding 继承的。所以它没有编码和解码方法。

我想要一些解决方案来解决这个问题

任何帮助将不胜感激。谢谢。

最佳答案

您不能在 Core Data 中保存 URLSessionDownloadTask,因为——正如您提到的——它不符合 NSCoding。在许多情况下,答案是编写您自己的代码以与 Data 相互转换,但在这种情况下这不起作用。 URLSessionDownloadTask 只能由 URLSession 创建,因此您不能序列化和反序列化任务对象。

但这并不重要,因为保存和恢复它们没有意义。 URLSessionDownloadTask 表示应用程序运行时正在进行的事情。如果您的应用已关闭,则该事件结束。在应用关闭并重新启动后恢复 URLSessionDownloadTask 没有意义,因为它没有可表示的事件。基本上,即使您可以存储任务对象并恢复它,恢复后它也没有用。没有理由打扰。

如果您的兴趣是要恢复未完成的下载,则必须从头开始。创建您的 URLSession,然后使用它创建新的 URLSessionDownloadTask。如果您有兴趣获取有关后台下载的信息,您可以使用带有 getTasksWithCompletionHandler(_:) 的 session 对象来查明它们是否已完成。

关于ios - 将 URLSessionDownloadTask 存储在 Core Data 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44326850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com