【问题标题】:Core Data slows to a crawl when editing a scrolling textview编辑滚动文本视图时,Core Data 会慢到爬行
【发布时间】:2011-11-15 00:13:22
【问题描述】:

这里有一个有趣的问题:

我有一些文本视图连接到核心数据模型。一切正常,除了一件事。

当我将信息放入 textview 时,整个应用程序会慢下来,调用沙滩球。

当我将 Core Data Instrument 附加到我的应用程序的进程时,NSManagedObjectContext save 会被调用,每个输入的字符都会被调用。这种滞后正在削弱整个应用程序。

为了让事情变得更奇怪,问题并不一致。有时,应用程序决定它需要将输入到 textview 中的每个字符写入保存的文档(SQLite、XML、二进制,无关紧要),而其他时候则不需要。

有什么想法吗?

【问题讨论】:

  • Bonus:看来我可以触发 NSManagedContextObject 保存:只需单击应用程序中的任何内容,而不仅仅是 TextView ......世界上是什么......

标签: objective-c xcode core-data nsdocument


【解决方案1】:

更新回复

我正在更新这个答案以反映正在发生的事情的现实。

正如 patrickn 在他最初的问题中所说,他正在使用 Core Data 开发一个基于文档的应用程序。他最终发现该文档为 autoSavesInPlace 返回 YES。事实证明,这是默认行为,这似乎对 NSManagedObjectContext 产生了不良影响。

According to Apple:

在 Mac OS X v10.7 及更高版本中,用户无需保存文档 明确或担心丢失未保存的更改。相反, 系统会根据需要自动将文档数据写入磁盘。您的 NSDocument 子类通过覆盖 autosavesInPlace 类方法返回 YES。理想的基线 无保存文档是这样的:用户在一个 应用程序窗口始终与磁盘上的文档相同。

听起来不错,但他们也说:

在启用自动保存之前,请考虑您的保存性能 应用。如果您的应用程序保存得很快,几乎没有理由 不要启用它。但是如果您的应用程序保存缓慢,启用 自动保存可能会导致您的用户界面定期阻塞,而 正在节省。

长话短说,如果您在 Lion 上开发基于文档的应用程序并且看到有问题的性能,您将需要考虑是否应该为 autosavesInPlace 返回 YES。

原始回复

如果你真的想修复,那么你必须找出调用保存操作的原因。这不是正常发生的事情,所以我会仔细查看您的代码并在每次调用保存时设置断点。

运行你的应用程序,你就能找出它发生在哪里。

它没有理由随机调用它,但是如果这样做之后你发现它仍然是,那么我会提交一个错误报告。

【讨论】:

  • 感谢您的回复,索斯伯恩。这个应用程序完全是通过xib创建的,我没有写一行代码。这并不是说我不愿意深入研究代码,但我发现以这种方式“开箱即用”的问题似乎很有趣。
  • 在这种情况下,我的猜测是您将 textView 连接到 IB 中的保存操作。右键单击 IB 中的 textView 并查看它连接到什么。
  • 检查了我所有的 TextView,没有一个链接到任何操作。他们只使用来自 Value -> 适当实体属性的绑定。
  • 根据您关于单击任意位置的评论,然后检查窗口的操作。基本上,如果您启动了一个新应用程序并在 IB 中构建了所有内容,那么发生这种情况的唯一方法就是将保存操作分配给某些东西。
  • 感谢 sosborn - 我已右键单击文档窗口中的每个对象(第一响应者、文件所有者、窗口、主菜单,在我的所有 6 个阵列控制器上)并找到没有什么可以保存相关操作。这个问题是否有可能与撤消有关?
【解决方案2】:

我不喜欢这个建议,但如果没有更有趣的事情发生,我会退回到这个建议。

我建议在 Core Data 和 UITextView 之间添加一个层,它可以缓冲信息并偶尔启动 Core Data 保存。 (而不是每个字符)

【讨论】:

  • 谢谢,文斯。正如我在回复 sosborn 时提到的,我没有为这个应用程序编写任何代码 - 它纯粹是使用 .xib 中的指向和单击配置创建的,用于文档(基于文档的应用程序)。鉴于这些信息,您如何建议添加所述层?
猜你喜欢
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多