【发布时间】:2014-06-09 12:47:40
【问题描述】:
我们最近将代码转换为使用 UIDocument,而不是直接在文件系统上操作文件,因此我们遇到了一些性能问题。我们想知道我们是否错误地使用了这个类,是否有其他人遇到这些问题,以及解决这些问题的常用方法是什么。
我们的应用
我们有一个“鞋盒应用程序”来管理一堆文档,每个文档都包含多个可能很重的图像文件、一个小的元数据文件和一个小的预览图像。用户的设备上可能有许多文档(1000 多个文档)。每个文档的文件都分组在一个目录中,我们使用 NSFileWrapper 来读取和写入它们。
当我们的应用启动时,它需要所有文档的元数据以显示文档索引和预览图像的子集。用户滚动时会加载更多预览图像。
为了获取该信息,我们打开所有文档,读取它们的元数据并在需要时预览图像,关闭它们,然后按需再次打开。
问题 #1:加载时间慢
打开所有文档并读取其元数据需要花费大量时间。我认为有几个因素导致了这个问题: - 每个文档打开动作比较慢 - 打开的文档块和完成块在同一个队列中执行,这使得操作的延迟非常糟糕(我的文档是打开的,但是完成块必须等待X个打开的文档块才能运行)
我们曾考虑使用单独的索引文件来解决这个问题,但这种方法的缺点是我们需要在两个地方管理元数据,并且我们需要保持它与文件系统同步,以防 iCloud 更改文件。
问题 #2:线程
每个打开的文档都会创建自己的“文件访问线程”。当我们同时打开许多文档时,开销会压垮应用。
我们通过使用信号量同步打开的操作解决了这个问题。这种方法的缺点是加载速度更慢。
问题
- 我们使用 UIDocument 的方式是否存在一些根本问题?如果没有:
- 有没有人遇到过类似的加载时间问题?解决它的常用方法是什么?其他应用程序是否保留索引文件?
- 有没有办法让 UI 文档使用线程池?如果没有,您如何控制资源使用?
谢谢!
【问题讨论】:
-
您找到解决方案了吗?我在很多包含多个大型视频文件的 UIDocuments 中遇到了同样的问题。我正在考虑完全放弃 UIDocument 或保留一个单独的索引文件。也许您对此有所了解?
-
@Rengers 请在下面查看我的回答。不幸的是,我没有好消息告诉你。
标签: ios multithreading performance uidocument