我有一个从辅助线程接收新数据的视图。每次都这样,它应该重绘自己。但是,它在运行循环中效果不佳,经过一段时间后(它是非确定性的),我最终在控制台中收到了<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应该重新显示视图。
答案 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];
});