UIDocument 和 NSFileWrapper - 尽管增量更改,大文件仍需要很长时间才能保存

2024-02-15

我有一个UIDocument基于应用程序使用NSFileWrappers 来存储数据。 “主”文件包装器包含许多附加的目录文件包装器,每个包装器代表文档的不同页面。

保存仅修改了一小部分页面的大型文档时,UIDocument在后台花费很长时间编写更改(在writeContents:andAttributes:safelyToURL:forSaveOperation:error:)。当然,它应该只写出对文件包装器的这一小更改......什么花了这么长时间?

My contentsForType:error:override 返回一个新的目录文件包装器,其中包含主文件包装器的内容(à laWWDC 2012 会议 218 - 将 iCloud 与 UIDocument 结合使用 http://adcdownload.apple.com//wwdc_2012/wwdc_2012_session_pdfs/session_218__using_icloud_with_uidocument.pdf):

- (id)contentsForType:(NSString *)typeName error:(NSError *__autoreleasing *)outError
{
    if (!_fileWrapper) {
        [self setupEmptyDocument];
    }
    return [[NSFileWrapper alloc] initDirectoryWithFileWrappers:[_fileWrapper fileWrappers]];
}

这是来自 Time Profiler 的堆栈跟踪的可爱图片:

顺便说一句,它说工作线程中需要节省约 1.6 秒 - 在实际运行时间中这相当于大约 8 秒。


Edit:

有什么方法可以检查文件包装器是否需要写入磁盘?只是这样我可以确认我没有以某种方式做一些奇怪的事情,例如当我进行小更改时更新每个子文件包装器(尽管我确定我没有......)。


Edit:

我进一步尝试了 CloudNotes 示例应用程序,看起来NSFileWrapper does实施增量节省,至少在这种情况下!我通过初始化一个包含 100 个注释的文档来测试它,每个注释包含大约 5MB 的数据。我在这里和那里做了一些小编辑(对文本视图的单个字符更改将文档标记为需要保存),并大致记录了每次保存花费的时间。测试相对粗糙(在模拟器上运行),但结果是这样的:

  • 第一次写入:~8000ms
  • 第二次写入:~4000ms
  • 第三次写入:~300ms
  • 所有后续写入:~40ms

显然,有很多因素影响它所花费的时间,特别是因为它是在后台线程中使用文件协调来保存的,但总的来说,趋势似乎总是这种指数衰减,直到所有写入变得非常快。

但我仍在试图找出为什么这不会在我的应用程序中发生。对于大型多页文档(很大,但仍然比我上面执行的 CloudNotes 测试的文档小很多倍),用户可能需要等待很多秒才能关闭文档。我不想为实际上应该是瞬时的事情安装一个旋转器。


NSFileWrapper实际上是将整个文档加载到内存中。所以用一个UIDocument,使用NSFileWrapper实际上对于大文档来说并不好。该文档让您认为它可以进行增量保存,但就我而言,它似乎并没有这样做。

UIDocument不仅限于NSFileWrapper or NSData。您可以使用自己的自定义类,只需重写某些方法即可。我最终编写了自己的文件包装类,该类仅引用磁盘上的文件并按需读取/写入单个文件。

这就是我的UIDocument类看起来像使用自定义文件包装器:

@implementation LSDocument

- (BOOL)writeContents:(LSFileWrapper *)contents
        andAttributes:(NSDictionary *)additionalFileAttributes
          safelyToURL:(NSURL *)url
     forSaveOperation:(UIDocumentSaveOperation)saveOperation
                error:(NSError *__autoreleasing *)outError
{
    return [contents writeUpdatesToURL:self.fileURL error:outError];
}

- (BOOL)readFromURL:(NSURL *)url error:(NSError *__autoreleasing *)outError
{
    __block LSFileWrapper *wrapper = [[LSFileWrapper alloc] initWithURL:url isDirectory:NO];
    __block BOOL result;
    dispatch_sync(dispatch_get_main_queue(), ^(void) {
        result = [self loadFromContents:wrapper
                                 ofType:self.fileType
                                  error:outError];
    });
    [wrapper loadCache];
    return result;
}

@end

我使用它作为基类并将其子类用于其他项目。它应该让您了解如何集成自定义文件包装类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UIDocument 和 NSFileWrapper - 尽管增量更改,大文件仍需要很长时间才能保存 的相关文章

  • 从 NSString 获取子字符串,直到到达特定单词

    假设我有这个NSString Country Address Tel number 我该如何获取之前的子字符串Tel 国家地址 然后我该如何获取后面的子字符串Tel 数字 使用 NSScanner NSString string Count
  • iOS:在代码中访问 app-info.plist 变量

    我正在开发通用应用程序 并且希望访问代码中 app info plist 文件中存储的值 原因 我使用以下方法从故事板动态实例化 UIViewController UIStoryboard storyboard UIStoryboard s
  • Selenium - 保存网站,包括所有图像、css、dom

    我想使用 firefox 或 chrome 访问带有 selenium 的页面 当页面加载时 我想从页面下载所有图像 css dom 我想存储每张图像 就像我在其中找到它们一样 chrome gt Tools gt Development
  • .net MVC 将 MP4 流式传输到 iDevice 问题

    我一直在编写用于提供视频服务的一段代码 但遇到了一些问题 代码如下 public ResumingFileStreamResult GetMP4Video string videoID if User Identity IsAuthenti
  • 关系上的核心数据属性?

    我刚刚开始使用核心数据 我有一个Headache实体和一个Medication实体 头痛和药物之间存在多对多的关系 当您加重头痛时 您可以选择多种药物 我希望能够指定这些药物的数量 我对 MySQL 更熟悉 您可以在其中创建一个数据透视表
  • 如何支持滑动删除具有组合布局的 UICollectionView 列表中的行?

    以前对于表视图 这是在UITableViewDataSource委托回调tableView commit forRowAt 相关 API 中是否有等效功能新的集合视图 https developer apple com documentat
  • 在React-native中,如何更改NavigatorIOS的样式

    在react native中 如何更改NavigatorIOS的样式 例如背景颜色 谢谢你 var speedNews React createClass render function return
  • CBPeripheralManager 连接回调

    我正在尝试在两个 iOS 设备之间建立蓝牙连接 这个想法是 一个设备提供一项服务 多个设备连接到该服务 设备 A 服务 用户滑动浏览演示文稿 设备 B 多个客户端 用户观看演示 无交互 根据我的理解 提供服务的人应该通过创建 CBPerip
  • 错误:“消息回复时间太长”向设备手表套件 OS 2 发送消息

    从 Apple Watch 向设备发送消息时出现以下错误 错误域 WCErrorDomain代码 7012 消息回复时间太长 UserInfo NSLocalizedDescription 消息回复时间太长 NSLocalizedFailu
  • SwiftUI TabbedView 仅显示第一个选项卡的内容

    我正在尝试建立一个TabbedView使用以下简单代码 TabbedView Text Hello world tabItemLabel Text Hello Text Foo bar tabItemLabel Text Foo 运行时 两
  • UI键盘回避和自动布局

    鉴于 iOS 6 中对自动布局的关注以及 Apple 工程师的推荐 查看 WWDC 2012 视频 我们不再直接操作视图的框架 那么如何仅使用自动布局和 NSLayoutConstraint 来避免键盘呢 Update 这看起来是一个合理的
  • 如何在iOS应用程序中实现互斥锁[重复]

    这个问题在这里已经有答案了 可能的重复 GCD 如何从两个线程写入和读取变量 https stackoverflow com questions 11070947 gcd how to write and read to variable
  • 当前位置在 Google 地图中不起作用

    我在 swift 3 中集成了谷歌地图 当地图屏幕出现而不显示当前位置时 我在 plist 文件中添加了两个键 并设置了 CLLocationManager delegate 和 requestAlwaysAuthorization cla
  • Swift 3 的 NSLog 问题

    迁移到 Swift 3 后 当我尝试执行以下操作时出现错误 self publicDB save listRecord completionHandler record error gt Void in if let saveError e
  • EXC_BAD_INSTRUCTION 的 CoreData 错误(代码=EXC_I386_INVOP,子代码=0x0)

    当我打开并发调试开关 com apple CoreData ConcurrencyDebug 1 来跟踪 CoreData 的所有并发问题时 在调用 insertingNewObjectForEntityForName 时不断发生崩溃 Xc
  • 在模拟器上卸载应用程序后,NSUserDefaults 未清除

    这听起来可能很菜鸟 我想检查用户是否第二次进入我的应用程序 以便保留我正在使用的运行计数NSUserDefaults 我已经在我的中实现了以下代码rootViewController s viewDidLoad method NSUserD
  • 如何在IOS中使用“*”字符进行呼叫(拨号)?

    我希望用 字符来调用 例如 gt 711313 目前 我正在使用这段代码 NSString str NSString stringWithFormat tel tmp UIApplication sharedApplication open
  • iOS 中的视频可以进行反卷积吗?

    我想拍摄击球手挥动棒球的镜头 但球棒很模糊 视频为 30 fps 通过研究 我发现反卷积似乎是最小化运动模糊的方法 但我不知道是否或如何在我的 iOS 应用程序后处理中实现它 我希望有人能给我指出正确的方向 比如如何在 iOS 中应用反卷积
  • 打印绘图时 Octave 崩溃

    Solution 根据用户 Andy 在评论中的建议 最新版本的 Octave 目前 octave 4 0 1 rc4 的更新解决了该问题 并且绘图可以另存为 PNG 我有大量数据在 Octave 中绘制 但是当我尝试保存图像时 程序崩溃了
  • 如何在 Swift 中解析蓝牙设备发送的浮点数?

    在我的 iOS 应用程序上 我需要解码蓝牙接收到的 Float 值 并从不同的设备 不是 iOS 获取 4 个字节 因此我需要一个 便携式 4 字节 Float 格式 目前发件人正在使用以下格式 数据编码 0xCCBBAAAEE 0xEE

随机推荐

  • 从 PHP 子类访问受保护的方法

    我可以使用至少两种基本方法来访问受保护的子类的类方法 parent myMethod this gt myMethod 如果我不需要在子类中重写它 在这种情况下我必须这样做 function myMethod parent myMethod
  • jQuery 中的remove() 和detach() 之间的区别[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • ImageView 不保持最大高度和宽度

    我将图像加载到ImageView using setImageURI selectedImageUri 从用户的照片库中检索 我有图像视图限制大小 android maxHeight 150dp android minHeight 150d
  • 卸载 NuGet 包时出现问题

    我正在尝试卸载 NuGet 安装的一些软件包 根据文档描述here http docs nuget org docs start here managing nuget packages using the dialog 我应该看到一个卸载
  • Tesseract OCR Android tessdata 目录未找到

    我目前正在使用 OCR 开发 Android 应用程序 并且已经达到了调用 BaseAPI init 方法的程度 我不断收到错误消息 指出该目录必须包含 tessdata 作为子文件夹 我已检查文件目录是否包含其中包含训练数据文件的文件夹
  • Node.js 上的文本到音频文件

    我正在寻找一种优化的合法方法来从 NodeJS 上的文本创建音频文件 现在我看到了 5 个变体 1 向谷歌翻译文本到语音 API 的简单 hhtp 请求 这种变体不好 因为每个请求都需要生成令牌 例如 传统知识 729008 879154
  • Crystal 从文件中读取 x 字节

    我有这个代码 a File open dev urandom b a read 1024 a close puts b 我原本希望从 dev urandom device file 获取前 1024 个字节 但我得到了一个错误 指出 rea
  • 如何在 Angular2 Typescript 项目中全局导入 Javascript 库?

    我试图弄清楚如何在我的 Angular2 项目中正确导入外部库 正如您在阅读有关此问题的其他答案时所看到的 对此存在一些困惑 甚至 Angular2 文档也没有相关信息 此外 Google 上的任何搜索都会导致与 Angular2 的 al
  • Silverlight 和 COM 互操作

    从 silverlight 与 COM 控件交互有哪些选项 在我的特定项目中 我有一个旧版 ActiveX 身份验证控件 我想在我的 silverlight 应用程序中利用它 没有太多无聊的细节 该控件采用几个参数 提示用户输入凭据或令牌
  • 如何在 Android 布局上正确分配 4 个按钮

    我试图将 4 个图像按钮分布到 Android 布局的 4 个可能的屏幕角落 无论分辨率如何 我希望图像背景是静态的 即 50x50 倾斜 并且我还希望在背景中全屏显示 android gesture GestureOverlayView
  • 如何在 ggplot2::geom_step() 中将线居中,类似于 highcharter

    对于我的情节 我想要ggplot2 geom step 线对齐以我的点为中心 而不是向左对齐 In highcharter hc add series type line 有一个选项叫做step center 看我的jsfiddle htt
  • 如何使用Python在Windows中设置代理?

    如何获取当前 Windows 浏览器代理设置并将其设置为一个值 我知道我可以通过查看注册表来做到这一点Software Microsoft Windows CurrentVersion Internet Settings ProxyServ
  • 如何在动态情况下寻找最短路径

    几天前 有人问我 如果我们的环境中有一些代理 他们想要从源头到达目的地 我们如何才能找到所有代理的总最短路径 以便他们在执行过程中不会发生冲突走 问题的关键是所有智能体同时在环境中行走 可以通过无向加权图建模 并且我们不应该发生任何碰撞 我
  • 在 NSPredicate 中使用 NSDate

    是否有特定的方法来配置 NSPredicate 来比较日期 本质上我有一个 Photo 对象 它有一个 NSDate lastViewed 我想配置一个 NSPredicate 它将返回最近在指定时间段 通常是两天 之前查看过的所有照片对象
  • 当我尝试安装 @nuxtjs/firebase 时出现 NPM 错误

    我收到这个错误 我不理解 而且我真的不知道如何修复 我正在使用 Nuxt js 我想同时使用 firebase 但是当我尝试 firebase nuxtjs 时 org 并安装 nuxtjs firebase 我收到此错误 npm ERR
  • 如何修复“UIPopoverController 已弃用”警告?

    我正在使用这段代码 mediaLibraryPopover UIPopoverController alloc initWithContentViewController avc self mediaLibraryPopover prese
  • Highcharts 在某些缩放级别不显示数据

    我正在使用 Highcharts Highstock 绘制相当大量的数据 10 000 点 数据由 X 轴上的 Date 对象组成 Y 轴上浮动 格式如下 date 1 728 date 0 346 日期始终相隔 1 小时 并且数据中没有间
  • 处置 RestRequest RestSharp 对象?

    我正在使用 RestSharp 并创建 RestRequest 对象以将 FileData 发送到 API 但是在得到响应后 我想从本地计算机中删除该文件 但是当我尝试执行相同操作时 它给了我错误 文件正在被其他进程使用 我认为的原因是我无
  • 附件名称和文件扩展名在电子邮件 *.eml 中不起作用

    我想在以下位置创建电子邮件文件 eml格式为包含多个附件 附件已生成 且附件内容正确 但附件总是进来 dat格式和文件名为 ATT00001 ATT0002 等 目前我正在遵循中给出的解决方案这个计算器问题 https stackoverf
  • UIDocument 和 NSFileWrapper - 尽管增量更改,大文件仍需要很长时间才能保存

    我有一个UIDocument基于应用程序使用NSFileWrappers 来存储数据 主 文件包装器包含许多附加的目录文件包装器 每个包装器代表文档的不同页面 保存仅修改了一小部分页面的大型文档时 UIDocument在后台花费很长时间编写