2010-07-06 58 views
0

我有一個從輔助線程接收新數據的視圖。每次它,它應該重繪自己。然而,它在運行循環中表現不佳,經過一段時間(非確定性)後,我終於在控制檯中獲得了<Error>: kCGErrorIllegalArgument: CGSUnionRegionWithRect : Invalid region消息。將呼叫同步到NSView的好方法是什麼?

我不知道什麼是正確的方式來跨線程同步調用[view setNeedsDisplay:YES];你可以幫我嗎?

要澄清一點,線程B(實際上是一個派遣隊列)通過調用這給了新的內容視圖:

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

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

然後線程A,在其上運行的運行循環,應重新顯示視圖。

回答

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 
} 
+0

咩。 「NSObject」肯定是我想要看的最後一個地方。非常感謝你。 – zneak 2010-07-06 02:28:42

+0

你可能想要閱讀「線程編程指南」,它會給你一個線索。 – JWWalker 2010-07-06 03:52:50

+0

@JWWalker:也許你打算把它看作是一個輕鬆愉快的嬉皮士,但是你的評論會帶有侮辱性,這是不可取的。我自己不知道有這樣的指導,並通過其他方式瞭解我的知識。 – 2010-07-06 04:08:52

0

隨着GCD你不需要額外的代理方法:

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