我正在为iPad开发基于文档浏览器的应用程序。我一直在使用SKQueue监视文件的更改,以确保当用户在文档浏览器中执行操作时它们的元数据保持最新。启动监视的代码:
// Set up the queue
let delegate = self
queue = SKQueue(delegate: delegate)!
// Remove all existing paths
queue?.removeAllPaths()
// Get the list of PDF URLs using a function that enumerates a folder's contents
let pdfFiles = getFolderContents(rootFolder: myDocumentsFolder, extensionWanted: "pdf")
for pdfFilePath in pdfFiles.filePaths {
queue?.addPath(pdfFilePath.path)
}
for pdfFolderPath in pdfFiles.folderPaths {
queue?.addPath(pdfFolderPath.path)
}
我开发了自己的逻辑来响应来自此队列的通知,但是在应用程序运行时,我没有从队列中删除任何项目。
问题-似乎当监视的项目数超过200(文件和文件夹)时,系统撞墙并且控制台报告错误24:打开太多文件。之后,将无法执行任何文件的读取/写入。
根据我从搜索中收集到的信息,似乎iOS和iPadOS不允许同时访问超过256个文件描述符,这意味着GCD监视文件更改的方法将遭受相同的限制。
是否有不受此限制的监视文件更改的方法?还有其他建议吗?
经过大量的研究和实验,我终于可以证实,对于MacOS,iOS和iPadOS,打开文件描述符的默认最大允许数目是256。在MacOS中可以轻松更改此设置-请参见文章here。但是,iOS和iPadOS本质上更加封闭,在这些平台上没有可靠的方法来更改此限制。
因此,良好做法是:
注:我建议枚举而不是其他获取文件系统状态的方法,因为其他方法往往会在模拟器和实际设备之间产生不兼容的结果(对符号链接解析的不同处理。)
就我而言,我的应用程序使用UIDocumentBrowserViewController,或者换句话说-Apple自己的Files应用程序,以允许用户管理其文件。我必须使元数据与文件系统状态保持最新,并且无法控制用户的文件管理习惯。使事情复杂化的是,“文件”应用程序本身可用于修改该应用程序的文件系统-当我的应用程序未激活时。
因此,我做了两件事: