如何确保在代码块结束时重新绘制NSWindow

时间:2016-06-10 12:07:57

标签: cocoa nswindow

我正在更新关键部分内的窗口。因为在这个窗口内绘制的数据是由其他人(在另一个关键部分内)访问的,所以我想确保在我退出临界区时更新绘制的窗口。

在Windows中,我可以使用InvalidateRect后跟UpdateWindow来确保存在强制绘制并且执行消息而不是简单地将其推送到队列中,标记为稍后执行。

在OSX中实现相同效果的相应方法是什么?

从文档中可以看出:

[myWindow display]其中myWindow类型为NSWindow应该可以做到,但它不会立即绘制它。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您可以通过在窗口中包含的视图上调用[self setNeedsDisplay]来强制它,然后在很短的时间内运行一个小的运行循环,以允许绘制消息传播到显示逻辑。

<configSections>
  <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true"/>
  </configSections>
  <connectionStrings>
<add name="ConStr" connectionString="Integrated Security=false;Persist Security Info=False;User ID=funny;password=veryfunny;Initial Catalog=vegimanager;Data Source=.\sqlexpress;"/>
      </connectionStrings>
  <connectionStrings>

这可能有用。这是一个相当奇怪的场景! YMMV。

答案 1 :(得分:1)

首先,你永远不会画进窗口。你绘制成视图。窗口只是视图的容器。

其次,视图应该知道自己,何时何地需要重新绘制。如果更改了底层数据,则报告该数据,但不报告绘图请求。这是因为控制器不能不,视图的哪个区域受到影响。

但是,毕竟我认为窗口更新请求是从另一个线程发送的。

使用GCD看起来像这样:

// Critical section ends here
dispatch_async( dispatch_get_main_queue(), 
^{ 
  [affectedView setNeedsDisplay]; 
});

使用线程

// Critical section ends here
[view performSelectorOnMainThread:@selector( setNeedsDisplay ) withObject:nil waitUntilDone:NO];