Как вызвать setNeedsDisplayInRect с помощью executeSelectorOnMainThread? - PullRequest
3 голосов
/ 19 ноября 2010

Как вызвать setNeedsDisplayInRect с помощью executeSelectorOnMainThread?Проблема прямая.Я не знаю, как передать прямоугольник в методе executeSelectorOnMainThread.Этот метод запрашивает NSObject, но CGRect это не NSObject, это просто структура *.

//[self setNeedsDisplayInRect:rect];
[self performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:0 waitUntilDone:YES];
}

-(void)drawRect:(CGRect)rect {

    /// drawing...

}

Мне нужно вызвать метод setNeedsDisplayInRect в MainThread из не основного потока.Кто нибудь знает как это сделать??????????Заранее спасибо.

Действительно спасибо.

1 Ответ

4 голосов
/ 19 ноября 2010

Если вы используете iOS 4.0 или более позднюю версию, вы можете использовать следующее

dispatch_async(dispatch_get_main_queue(), ^{
    [self setNeedsDisplayInRect:theRect];
});

В iOS 3.2 и более ранних версиях вы можете настроить NSInvocation и запустить его в основном потоке:

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(setNeedsDisplayInRect:)]];
[invocation setTarget:self];
[invocation setSelector:@selector(setNeedsDisplayInRect:)];
// assuming theRect is my rect
[invocation setArgument:&theRect atIndex:2];
[invocation retainArguments]; // retains the target while it's waiting on the main thread
[invocation performSelectorOnMainThread:@selector(invoke) withObject:nil waitUntilDone:YES];

Возможно, вы захотите установить для waitUntilDone значение NO, если вам абсолютно не нужно ждать завершения этого вызова, прежде чем продолжить.

...