【发布时间】:2009-09-16 13:50:26
【问题描述】:
我想使用performSelectorOnMainThread: 致电(void)setDoubleValue:(double)value。
我认为可行的是:
NSNumber *progress = [NSNumber numberWithDouble:50.0];
[progressIndicator performSelectorOnMainThread:@selector(setDoubleValue:)
withObject:progress
waitUntilDone:NO];
没用。
然后我实现了一个辅助方法:
- (void)updateProgressIndicator:(NSNumber *)progress
{
[progressIndicator setDoubleValue:[progress doubleValue]];
}
有效,但不是很干净。
之后我用NSInvocation尝试了它。
NSInvocation *setDoubleInvocation;;
SEL selector = @selector(setDoubleValue:);
NSMethodSignature *signature;
signature = [progressIndicator methodSignatureForSelector:selector];
setDoubleInvocation = [NSInvocation invocationWithMethodSignature:signature];
[setDoubleInvocation setSelector:selector];
[setDoubleInvocation setTarget:progressIndicator];
double progress = 50.0;
[setDoubleInvocation setArgument:&progress atIndex:2];
[setDoubleInvocation performSelectorOnMainThread:@selector(invoke)
withObject:nil
waitUntilDone:NO];
此解决方案有效,但它使用大量代码并且速度很慢。 (即使我存储了调用。)
还有其他方法吗?
【问题讨论】:
-
[[progressIndicator class] instanceMethodSignatureForSelector:selector]可以写成[progressIndicator methodSignatureForSelector:selector]
标签: objective-c cocoa multithreading