在运行循环的旋转中使用核心数据撤消组

Posted

技术标签:

【中文标题】在运行循环的旋转中使用核心数据撤消组【英文标题】:Undo Group with Core Data across spins of run loop 【发布时间】:2012-01-18 18:50:15 【问题描述】:

我正在尝试设置一个撤消组,该组涵盖在平移手势识别器期间发生的所有更改。被修改的对象是来自 Core Data 的 NSManagedObjects。

当手势进入“开始”阶段时,代码会启动一个撤消组并关闭按事件分组。在“结束”和“取消”阶段,组结束并重新打开按事件分组。

在识别器的每次“更改”时,都会更新相同的核心数据对象。随后,Core Data 为该特定更改创建一个新的撤消组。

有什么方法可以获取核心数据来阻止这种情况?或者我是否需要更改在这种情况下处理撤消的方式?

我有一个示例项目here,在 BBQMainViewController.m 的 handlePanGesture: 方法(第 82 行)中有相关代码。该项目在每次更新识别器时将撤消堆栈打印到控制台。如您所见,撤消堆栈构建和构建。如果注释掉第 168 行,撤消堆栈不会建立。

【问题讨论】:

【参考方案1】:

既然您每次通过手势识别器循环都修改相同的NSManagedObject(好吧,无论如何,在最后的else 子句中),为什么不缓存该值并将对象的值设置为一次UIGestureRecognizerStateEnded

可能(我还不是足够确定的 Core Data 专家)Core Data 明确地为每个更改创建一个新的撤消组级别(至少对同一个对象)在图表中)无论您的 setGroupsByEvent: 设置如何。

【讨论】:

我相信 Core Data 根据我的测试将所有更改合并到同一个运行循环中。该示例已从有问题的实际项目中大大简化。每次更改都会发生更多事情,它会更新 UI,然后也需要更改 Core Data。【参考方案2】:

事实证明,我看到的问题实际上是由我正在开发的应用程序在撤消后未正确更新 UI 引起的。

在手势开始时创建一个撤消组,然后在结束或取消状态时将其关闭,这会包装核心数据在识别器更改状态更新期间创建的所有撤消组。在撤消管理器上调用撤消撤消整个组,包括由 Core Data 创建的嵌套组。

简而言之:用户错误。像往常一样。

【讨论】:

以上是关于在运行循环的旋转中使用核心数据撤消组的主要内容,如果未能解决你的问题,请参考以下文章

如何将运行无限循环的线程限制为 1 个核心?

使用 Processing 在双 for 循环中旋转每个单独的元素时遇到问题

嵌套宏不循环

在for循环中运行函数并将返回的数据帧添加到R中的列表中

Roblox 无限旋转循环

While 循环使用用户输入和命令运行