Cocoa 如何确保在代码块末尾重新绘制NSWindow

Cocoa 如何确保在代码块末尾重新绘制NSWindow,cocoa,nswindow,Cocoa,Nswindow,我正在更新关键区域内的窗口。因为在这个窗口中绘制的数据是由其他人(在另一个关键部分中)访问的,所以我想确保在我退出关键部分时绘制的窗口被更新 在Windows中,我可以使用invalidate后跟UpdateWindow来确保存在强制绘制,消息被执行,而不是简单地推送到队列中,标记为稍后执行 在OSX中实现相同效果的相应方法是什么 从文档中可以看出: [myWindow display]其中myWindow属于NSWindow类型,应该可以完成此功能,但不会立即绘制 有什么建议吗?您可以通过在窗

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

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

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

从文档中可以看出:

[myWindow display]
其中
myWindow
属于
NSWindow
类型,应该可以完成此功能,但不会立即绘制


有什么建议吗?

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

    [viewToRefresh setNeedsDisplay];
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode 
                             beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];

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

首先,你永远不会画进窗户。你可以在视图中绘制。窗口只是视图的容器

第二,视图应该知道自己,何时何地需要重新绘制。如果下面的数据已更改,则报告该数据,但不报告图形请求。这是因为控制器无法确定视图的哪个区域受到影响

然而,毕竟我假设窗口更新请求是从另一个线程发送的

使用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];

我已经试过了,但我对打乱运行循环有点怀疑。有没有任何参考资料可以证实这样做是安全的?我们在代码中已经将其用于非常不同的场景,以允许通知通过。这不是一个理想的情况(通常我宁愿重构代码来删除依赖项),但基本上Cocoa draw循环超出了您的控制?