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 または am 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 に答える