Cocoa [NSWindow setFrame:display:]API是否异步?

Cocoa [NSWindow setFrame:display:]API是否异步?,cocoa,nswindow,Cocoa,Nswindow,我有一个奇怪的UI行为,这让我认为这个API可能是异步的。假设它是(异步的),我已经做了一些更改,现在UI按预期工作。我在苹果的文档中没有找到答案。 有人对此熟悉或有经验吗?它真的是异步的吗?谢谢 编辑:所有UI更改都是从主线程进行的。设置框架:显示:更新框架,并告诉系统在下一个绘图周期重新绘制窗口(可能还有子视图)。Cocoa绘图始终在其绘图周期内完成,而不是在调用绘图方法时完成。有关这方面的更多讨论,请参阅 这最好被认为是“合并”而不是“异步”的绘图。除非有动画,否则所有绘图通常应在下一个事

我有一个奇怪的UI行为,这让我认为这个API可能是异步的。假设它是(异步的),我已经做了一些更改,现在UI按预期工作。我在苹果的文档中没有找到答案。 有人对此熟悉或有经验吗?它真的是异步的吗?谢谢


编辑:所有UI更改都是从主线程进行的。

设置框架:显示:更新框架,并告诉系统在下一个绘图周期重新绘制窗口(可能还有子视图)。Cocoa绘图始终在其绘图周期内完成,而不是在调用绘图方法时完成。有关这方面的更多讨论,请参阅

这最好被认为是“合并”而不是“异步”的绘图。除非有动画,否则所有绘图通常应在下一个事件循环之前完成。视图可能会以某种方式将其绘制延迟到稍后的事件循环,但这种情况很少见。10.8+中的图层备份视图可以支持实际的异步绘图,但这不是默认值


根据您的描述,您可能正在从主线程以外的线程调用
setFrame:display:
。AppKit绘图不是线程安全的。除了主线程,您不能在任何地方调用绘图方法,否则您将得到“奇怪的UI行为”(这不是完全正确的。在OS X上,您可以使用
lockFocus
从其他线程绘制,但在解锁focus后的下一个绘制周期之前,它们仍然不会实际应用。但通常情况下,在现代OS X中,最好仅从主线程绘制,因为GCD使这一过程变得简单。)

更具体地说,当在
setFrame:display:
之后立即执行Z排序时,有时Z排序没有执行。您所说的“绘图周期”是什么意思?绘图周期发生在事件循环的末尾。Cocoa调用了您的某个方法(
drawRect:
,一个计时器事件,等等)。至少在您从该函数返回之前,绘图不会发生。
setFrame:display:
不应该修改z顺序,所以我不知道您所说的“正在执行”是什么意思