Ios 错误:";无法打开数据库文件"&&引用;“打开的文件太多”;

Ios 错误:";无法打开数据库文件"&&引用;“打开的文件太多”;,ios,sqlite,swift3,documentsdirectory,Ios,Sqlite,Swift3,Documentsdirectory,我已经检查了许多关于这些错误的问题,例如&,但是让我告诉你我的情况 我在视图上加载图像&在集合视图中单击资产18次后,我的代码返回此错误。我没有做任何复杂的事情,我只是添加了相同的资产,它被点击在该资产上方的视图上 信息:我正在创建资产并将其保存在documents目录中,并且仅从那里获取它们 下面是我的错误代码: let data = try Data(contentsOf: URL(fileURLWithPath: (contentsOfFile: (userInfo[kPath] as!

我已经检查了许多关于这些错误的问题,例如&,但是让我告诉你我的情况

我在视图上加载图像&在集合视图中单击资产18次后,我的代码返回此错误。我没有做任何复杂的事情,我只是添加了相同的资产,它被点击在该资产上方的视图上

信息:我正在创建资产并将其保存在documents目录中,并且仅从那里获取它们

下面是我的错误代码:

let data = try Data(contentsOf: URL(fileURLWithPath: (contentsOfFile: (userInfo[kPath] as! String))), options: .uncached)
我试图获取imageData&然后将其作为image视图中的image,但在单击几下之后,Try语句返回以下错误

“打开的文件太多”

我还尝试了另一种加载图像的方法,即

UIImage(contentsOfFile: imageFilePath)!
但结果是一样的


有谁能帮我指导如何解决这个错误吗?

您与我们共享的代码不太可能是“打开的文件太多”问题的根源,而更可能只是另一个问题的症状。您的另一个错误“无法打开数据库文件”表明了更可能的原因,例如,您可能正在打开数据库,但没有正确关闭它们,最终导致打开的文件过多

我建议仔细检查所有打开的文件,并仔细检查是否正确关闭它们。特别是如果您正在进行自己的SQLite3API调用,那么这样做非常容易,因为文件不会自动关闭。我建议在打开和关闭文件的任何地方添加日志语句,并确保每个“打开”都对应一个“关闭”

如果文件的打开和关闭是在Swift代码中进行的,在Swift代码中有许多
If
guard
语句,通常将“close”放在
defer
语句中是一种很好的方法,可以确保无论执行路径如何,都能调用close


作为与此文件打开问题无关的旁白,代码片段中对
contentsOfFile
的引用是误导性的/不必要的。您可以将其简化为:

let data = try Data(contentsOf: URL(fileURLWithPath: userInfo[kPath] as! String), options: .uncached)

实际上,每个操作系统对给定进程一次可以打开的文件数量都有一定的限制。该限制通常在10000-100000之间,具体取决于操作系统和版本,但在某些情况下可能更小,数据库系统可能会施加自己的限制。特别是在编写扫描目录的代码时,很容易意外地打开许多文件而不关闭它们。您能告诉我,如何在Swift中关闭这些文件吗?我正在下载png文件并将它们分配到UIImageView中。然而,在300-400之后,我得到了同样的错误。我假设在分配图像后关闭这些图像将解决此错误。希望你能回应。谢谢大家!@sc13-正如我告诉iYoung的,我不相信
UIImageView
会显示出“太多文件”。如果不能正确管理进程,但
UIImage
无法挂起文件,则可能会出现内存不足(出现意外行为)。(我刚刚在collection视图中对10000个单独的图像进行了快速测试,没有收到这样的错误)。我怀疑你还有别的事。我会把你的注意力转移到你的应用程序可能正在处理文件的其他事情上。如果您仍然有问题,请将您自己的问题发布到@Rob,谢谢。我已经问了我的问题,但没有人回答。