是否可以创建一个块变量作为接受参数的选择器,并将其传递给performSelector:withObject:?目前,编写一些测试并希望编写一个包含所有相关检查的自包含方法。需要传递一个块,接收它中的参数并在该块中进行一些检查。我正在寻找类似的东西:
...
SEL blockAsSelector = ^{(NSString *param){NSLog(@"Passed param = %@", param);}}
[self performSelector:blockAsSelector withObject:stringThatWillBeUsedAsParamInBlock];
...
答案 0 :(得分:2)
是否可以创建一个块变量作为接受参数的选择器,并将其传递给performSelector:withObject:?
没有。块和选择器不是一回事。
在您的示例中,它没有意义。 -performSelector:withObject:
在同一个线程上同步运行。您也可以执行该块,即
void (^myBlock)(NSString*) = ^(NSString *param){NSLog(@"Passed param = %@", param);};
myBlock(@"foo");
如果你想同时在块中进行工作,你可以使用GCD或NSBlockOperation。
答案 1 :(得分:1)
如果您不需要延迟来执行操作,您可以:
[[NSOperationQueue mainQueue] addOperationWithBlock:^(void)block]
答案 2 :(得分:0)
我通常同意其他答案,你应该尝试找到另一种方法来做到这一点,因为选择器和块实际上不是可以互换的。但如果你绝对不得不这样做,我认为这样的事情是你最好的选择:
// BlockWrapper.h
@interface BlockWrapper : NSObject
@property(nonatomic, retain) void (^block)(NSString*);
@property(nonatomic, copy) NSString* string;
@end
// Your other code file
- (void)evaluateBlockWrapper:(BlockWrapper)wrapper {
wrapper.block(wrapper.string);
}
...
BlockWrapper* wrapper = [[BlockWrapper alloc] init];
wrapper.block = ^(NSString* param) { NSLog(@"Passed param = %@", param); }
wrapper.string = stringThatWillBeUsedAsParamInBlock;
[self performSelector:@selector(evaluateBlockWrapper:) withObject:wrapper];
...
虽然这让我想知道为什么你想让块接受一个字符串参数,而不只是引用块内的字符串:
// Your other code file
- (void)evaluateBlock:(void (^)(void))block {
block();
}
...
[self performSelector:@selector(evaluateBlock:)
withObject:^{
NSLog(@"Passed param = %@", stringThatWillBeUsedAsParamInBlock);
}];
...
我对这里的所有内存管理都不太了解,所以其他人必须仔细检查我。