Как передать параметр @selector в качестве параметра?
Для метода:
[NSThread detachNewThreadSelector:@selector(method:) toTarget:self withObject:(id)SELECTOR];
Как пройти в @selector? Я попытался выполнить его (id), чтобы скомпилировать его, но он врезан во время выполнения.
В частности, у меня есть такой метод:
+(void)method1:(SEL)selector{
[NSThread detachNewThreadSelector:@selector(method2:) toTarget:self withObject:selector];
}
Сбой. Как передать селектор без сбоев, чтобы новый поток мог вызвать селектор, когда поток готов?
Ответы
Ответ 1
Проблема здесь заключается не в передаче селектора методу как таковой, а в передаче селектора, где ожидается объект. Чтобы передать значение без объекта в качестве объекта, вы можете использовать NSValue
. В этом случае вам нужно создать метод, который принимает NSValue и получает соответствующий селектор. Вот пример реализации:
@implementation Thing
- (void)method:(SEL)selector {
// Do something
}
- (void)methodWithSelectorValue:(NSValue *)value {
SEL selector;
// Guard against buffer overflow
if (strcmp([value objCType], @encode(SEL)) == 0) {
[value getValue:&selector];
[self method:selector];
}
}
- (void)otherMethodShownInYourExample {
SEL selector = @selector(something);
NSValue *selectorAsValue = [NSValue valueWithBytes:&selector objCType:@encode(SEL)];
[NSThread detachNewThreadSelector:@selector(methodWithSelectorValue:) toTarget:self withObject:selectorAsValue];
}
@end
Ответ 2
Вы можете конвертировать между селекторами и строковыми объектами с помощью функций NSStringFromSelector()
и NSSelectorFromString()
. Поэтому вы можете просто передать строковые объекты.
В качестве альтернативы, если вы не хотите изменять свои методы, вы можете создать NSInvocation
для создания вызова для вызова метода (поскольку он может настраивать вызовы с аргументами, отличными от объекта), а затем вызвать его do [NSThread detachNewThreadSelector:@selector(invoke) toTarget:myInvocation withObject:nil];
Ответ 3
Используйте NSValue, например:
+(void)method1:(SEL)selector {
NSValue *selectorValue = [NSValue value:&selector withObjCType:@encode(SEL)];
[NSThread detachNewThreadSelector:@selector(method2:)
toTarget:self
withObject:selectorValue];
}
NSValue предназначен как объект-обертка для произвольных не-объектов.
Ответ 4
Пожалуйста, смотрите: передача метода в качестве аргумента
Ответ 5
Если вы не хотите указывать объект, просто используйте nil.
[NSThread detachNewThreadSelector:@selector(method:) toTarget:self withObject:nil];
Если вам нужно передать объект в селектор, он будет выглядеть примерно так.
Здесь я передаю строку методу "setText".
NSString *string = @"hello world!";
[NSThread detachNewThreadSelector:@selector(setText:) toTarget:self withObject:string];
-(void)setText:(NSString *)string {
[UITextField setText:string];
}