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

时间:2015-12-27 16:24:19

标签: cocoa nswindow

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

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

1 个答案:

答案 0 :(得分:0)

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //put your code here } }); 更新框架并告诉系统在下一个绘图周期中重绘窗口(可能还有子视图)。 Cocoa绘图总是在绘制周期中完成,而不是在您调用绘图方法时。有关此问题的更多讨论,请参阅What is the most robust way to force a UIView to redraw?

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

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