通过performSelectorOnMainThread传递基元

Cha*_*son 10 macos objective-c nsthread

好吧,所以说我有第二个线程正在运行,但它想在主线程上操作一些东西,比如一个UI项目.

-(void)backgroundThread
{
    [myButton performSelectorOnMainThread:@selector(setEnabled:) withObject:(BOOL)YES waitUntilDone:YES];
     // right here, how could i pass this BOOL to the function
}
Run Code Online (Sandbox Code Playgroud)

我尝试过使用NSNumber's numberWithBOOL,但NSButton不接受它.

小智 16

您不能使用performSelectorOnMainThread:withObject:waitUntilDone:不是Objective-C对象的参数,也不能使用,NSNumber因为没有从对象到原始类型的自动拆箱.

一种解决方案是实现一个类似的方法,它接受一个按钮作为参数并调用该方法.

例如,在同一个类中:

- (void)enableButton:(NSButton *)button {
    [button setEnabled:YES];
}
Run Code Online (Sandbox Code Playgroud)

-(void)backgroundThread{
    [self performSelectorOnMainThread:@selector(enableButton:)
                           withObject:myButton
                        waitUntilDone:YES];
}
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是NSButton使用替代方法(例如-setEnabledWithNumber:)实现类别,并使用该方法:

@interface NSButton (MyButtonCategory)
- (void)setEnabledWithNumber:(NSNumber *)enabled;
@end

@implementation NSButton (MyButtonCategory)
- (void)setEnabledWithNumber:(NSNumber *)enabled {
    [self setEnabled:[enabled boolValue]];
}
@end
Run Code Online (Sandbox Code Playgroud)

-(void)backgroundThread{
    [myButton performSelectorOnMainThread:@selector(setEnabledWithNumber:)
                               withObject:[NSNumber numberWithBool:YES]
                            waitUntilDone:YES];
}
Run Code Online (Sandbox Code Playgroud)