0

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

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

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

3 回答 3

2

是否可以创建一个块变量作为选择器接受参数,并将其传递给 performSelector:withObject:?

不,块和选择器不是一回事。

在您的示例中,这没有意义。 -performSelector:withObject:在同一个线程上同步运行。你不妨只执行块即

void (^myBlock)(NSString*) = ^(NSString *param){NSLog(@"Passed param = %@", param);};

myBlock(@"foo");

如果你想同时在块中完成工作,你会使用 GCD 或 NSBlockOperation。

于 2012-04-20T13:18:38.790 回答
1

如果您不需要延迟来执行操作,您可以:

[[NSOperationQueue mainQueue] addOperationWithBlock:^(void)block]
于 2012-04-20T12:45:16.080 回答
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);
    }];
...

我不太确定这里的所有内存管理,所以其他人将不得不仔细检查我。

于 2014-08-10T18:25:42.243 回答