我正在建立能够录制视频,音频和图像的app。每个媒体都与CoreData实体一起存储,其二进制数据属性与外部存储(Core Data实体中的二进制数据选项)一起存储。例如,一条记录可以包含以下关系的许多视频:
到目前为止,一切运行良好,但在一些性能测试中,我发现应用程序没有正确释放CoreData对象,或者至少可以预测(对我来说)。
第一个问题是当我从上下文删除对象并保存它时,它仍然保留在持久内存中,因为我可以使用自己的谓词提取找到它。但是,例如TableView的默认提取(在创建新项目时生成的代码)会忽略已删除的对象。我删除记录对象,例如从表视图这样:
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
let context = fetchedResultsController.managedObjectContext
let object:Record = fetchedResultsController.object(at: indexPath) as! Record
context.delete(object)
do {
try context.save()
print("saved")
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
}
下一期是我不确定此时是否执行了级联删除...
这指向第三个也是最后一个问题 - 二进制数据文件保留在应用程序内存中(通过Xcode下载App Container进行检查)。这个主要问题导致应用程序无法控制地“扩展”。
我相信外部存储空间会自动解决此问题。即使我手动nil保存二进制数据的变量,真实文件仍然保留在持久内存中。
所以问题可能听起来像这样:
1。当Core Data从持久性内存中永久释放对象时?
2。何时从持久性内存中删除外部二进制数据?
感谢各位的帮助!
更新#1:
因此,根据Core Data Programming Guide,对托管对象有强烈的引用。章节打破对象之间的强引用描述得很好。不幸的是,没有任何建议帮助我解决上述问题。
更新#2:
解决了文件的问题,这是我的代码中的一个错误,因为我忘了清除临时文件夹和目的地......
学家