Каков хороший способ синхронизировать вызовы с NSView? - PullRequest
0 голосов
/ 06 июля 2010

У меня есть представление, которое получает новые данные из вторичного потока. Каждый раз, когда это происходит, он должен перерисовывать себя. Тем не менее, это не очень хорошо работает с циклом выполнения, и через некоторое время (оно не является детерминированным), я получаю <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 ]

1 голос
/ 06 июля 2010
-(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 голосов
/ 22 августа 2011

С GCD вам не нужен дополнительный метод прокси:

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