同步调用NSView的好方法是什么?

时间:2010-07-06 01:55:55

标签: multithreading macos synchronization nsview

我有一个从辅助线程接收新数据的视图。每次都这样,它应该重绘自己。但是,它在运行循环中效果不佳,经过一段时间后(它是非确定性的),我最终在控制台中收到了<Error>: kCGErrorIllegalArgument: CGSUnionRegionWithRect : Invalid region条消息。

我不确定在线程之间同步调用[view setNeedsDisplay:YES]的正确方法是什么?你能救我吗?

为了澄清一点,线程B(实际上是一个调度队列)通过调用它给视图提供了新的内容:

-(void)setImageBuffer:(unsigned char*)buffer
{
    /* image handling stuff; thread-safe */

    [self setNeedsDisplay:YES]; // but this is not thread-safe
}

然后运行运行循环的线程A应该重新显示视图。

2 个答案:

答案 0 :(得分:1)

-(void)setImageBuffer:(unsigned char*)buffer
{
    /* image handling stuff; thread-safe */

    [self performSelectorOnMainThread:@selector(induceRedraw)
                           withObject:nil
                                      // Don't just copy this; pick one...
                        waitUntilDone:YES or NO];
}

-(void)induceRedraw
{
    [self setNeedsDisplay:YES]; // but this is not thread-safe
}

答案 1 :(得分:0)

使用GCD,您不需要额外的代理方法:

dispatch_queue_t q = dispatch_get_main_queue();
dispatch_async(q, ^(void) {
  [self setNeedsDisplay: YES];
});