1

直到MACOS 10.12下面的代码工作正常在后台线程:MACOS 10.13海伊谢拉:获取到NSGraphicsContext flushGraphics]在后台线程没有影响

[nsView lockFocusFocus]; 
... draw something ... 
[[NSGraphicsContext currentContext] flushGraphics]; 
[nsView unlockFocus]; 

凭借10.13然而,flushGraphics不更新视图的内容立即了。

我知道现在不鼓励从后台线程绘图,但这并不意味着它不再可能。事实上,所有东西都在...中画出一些东西...仍然会到视图的后台商店。一旦drawRect:在主UI线程中被下一次调用,视图就会刷新,所有内容都已正确放置。

这怎么能立即发生?有没有办法对立即可见的视图进行更改?

回答

0

事实证明,对于macOS 10.13,如果drawRect:实际上没有在该方法的范围内绘制任何内容,即使其后备存储已被修改,该视图的显示也不会刷新。

所以,如果你想刷新到屏幕上挂起的更改,关键是要作出了AppKit 认为东西绘制,至少画一个小的看不见的矩形:

- (void) drawRect: (NSRect)rect 
{ 
    if (drawRectWasRequestedByRefresh) { 
     // flush pending changes drawn on background thread 
     [[NSColor clearColor] set]; 
     [NSBezierPath strokeRect: NSMakeRect(0,0,1,1)]; 
     drawRectWasRequestedByRefresh = NO; 
    } else { 
     // draw your view's regular contents here 
    } 
} 

要从触发刷新后台线程,使用这个技巧:

- (void) refresh 
{ 
    drawRectWasRequestedByRefresh = YES; 
    [self setNeedsDisplay: YES]; 
} 

这肯定是只需要为那些需要从后台线程(无论何种原因)立即绘图应用一个肮脏的黑客。如果有人知道更好的解决方案,我会很乐意听到!