NSUndoManager.groupsByEvent如何确定当前的运行循环传递?

时间:2017-05-20 09:43:00

标签: cocoa foundation nsrunloop cfrunloop

我想了解/复制NSUndoManger的“运行循环传递/循环组”功能:

当在同一个运行循环周期中多次调用时,

NSUndoManager可以将对registerUndo()的多个调用分组为单个“撤消”操作。这由NSUndoManager.groupsByEvent确定,默认设置为true

这样的事情:

// User clicks button... (causes a new run loop event)
undoManager.registerUndo(...) // #1
undoManager.registerUndo(...) // #2

...导致一个撤消组并单击编辑→撤消立即恢复两个更改。

不知何故,NSUndoManager可以判断对registerUndo()的两次调用是否在同一个运行循环周期内。这是如何工作的?

我的用例:

我有代码在用户与UI交互后发送属性更改通知(例如,单击按钮)。作为用户操作的结果,可以有一个或多个事件。我想将这些分组并在当前运行循环结束时仅更新一次UI。

1 个答案:

答案 0 :(得分:1)

  

NSUndoManager通常在运行循环期间自动创建撤消组。第一次要求在运行循环中记录撤消操作时,它会创建一个新组。然后,在循环结束时,它会关闭该组。

来源:Undo Operations and Groups

NSUndoManager是与NSRunLoop相同的框架的一部分,因此NSRunLoop可能会NSUndoManager发出信号以关闭群组。你不知道,你不应该知道。