如何使用param将块作为选择器传递给performSelector:withObject:?

时间:2012-04-20 12:38:52

标签: objective-c ios selector block

是否可以创建一个块变量作为接受参数的选择器,并将其传递给performSelector:withObject:?目前,编写一些测试并希望编写一个包含所有相关检查的自包含方法。需要传递一个块,接收它中的参数并在该块中进行一些检查。我正在寻找类似的东西:

...
SEL blockAsSelector = ^{(NSString *param){NSLog(@"Passed param = %@", param);}}

[self performSelector:blockAsSelector withObject:stringThatWillBeUsedAsParamInBlock];
...

3 个答案:

答案 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);
    }];
...

我对这里的所有内存管理都不太了解,所以其他人必须仔细检查我。