错误:"无法打开数据库文件" &安培; "太多打开的文件"

时间:2017-01-04 09:15:02

标签: ios sqlite swift3 documentsdirectory

我已经检查了很多关于SO的问题,例如this& this,与这些错误有关,但让我告诉你我的情景。

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

信息:我正在创建资产&将它们保存在文档目录和只从那里取出它们。

以下是我的代码,其中包含错误:

 var myApp = angular.module('myApp', []);
 myApp.controller('MyCtrl', ['$scope', function($scope) {
 $scope.data = [{
  company: "companyA",
  headOffice: "cityA",
  industry: "software",
  transactionCurency: "USD",
  otherAspect: {
    numberofEmployees: "10000",
    public: "yes",
    listed: "NYSE"
  }
},

{
  company: "companyB",
  headOffice: "cityA",
  industry: "software",
  transactionCurency: "USD",
  otherAspect: {
    numberofEmployees: "20000",
    public: "no",
    listed: "NA"
  }
},

{
  company: "companyC",
  headOffice: "cityB",
  industry: "Oil",
  transactionCurency: "EUR",
  otherAspect: {
    numberofEmployees: "150000",
    public: "yes",
    listed: "LSE"
  }
}, {
  company: "companyD",
  headOffice: "cityX",
  industry: "manufactoring",
  transactionCurency: "YEN",
  otherAspect: {
    numberofEmployees: "30000",
    public: "yes",
    listed: "TSE"
  }
},

{
  company: "companyE",
  headOffice: "cityB",
  industry: "Auto",
  transactionCurency: "EUR",
  otherAspect: {
    numberofEmployees: "330000",
    public: "no",
    listed: "NA"
  }
}
];
}]);

我正在尝试获取imageData&然后在图像视图中将其作为图像,但在几次单击后,Try语句将返回错误

  

"太多打开的文件"

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

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

但结果是一样的。

任何人都可以通过指导如何解决此错误来帮助我吗?

1 个答案:

答案 0 :(得分:4)

您与我们分享的代码不太可能成为“太多文件打开”问题的来源,而更可能只是另一个问题的症状。您的其他错误“无法打开数据库文件”表明更可能是罪魁祸首,例如您可能正在打开数据库但没有正确关闭它们,最终会打开太多文件。

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

如果文件的打开和关闭发生在你有许多ifguard语句的Swift代码中,通常将“close”放在defer语句中是个不错的方法无论执行路径如何,都要确保关闭。

与此文件打开问题无关,在您的代码段中对contentsOfFile的引用会产生误导/不必要。您可以将其简化为:

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