2012-04-20 36 views
0

是否有可能創建一個塊變量作爲選擇器接受參數,並將其傳遞給performSelector:withObject:?目前,編寫一些測試並希望編寫一個包含所有相關檢查的自包含方法。需要傳遞一個塊,接收其中的參數並在該塊中進行一些檢查。我在尋找類似:如何使用參數傳遞一個塊作爲選擇器來執行選擇器:withObject:?

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

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

也許我不明白,爲什麼不直接打電話給我? block(param); – ssteinberg 2012-04-20 12:44:49

+0

是的,我不明白你在問什麼。這沒有意義。在這個例子中,接收者「self」扮演什麼角色? – 2012-04-20 13:01:25

+0

@ssteinberg,爲了簡單起見,我寫了這兩行。實際上,我正在測試其他一些方法「exportToSelector:onTarget:WithObject」。該方法接收選擇器和目標,是否有作業和回調以選擇器,數據對象爲目標,並且我需要檢查這些數據。所以,在我的測試方法中,我想通過「exportToSelector:onTarget:WithObject」中的塊並檢查塊中的結果。在這種情況下,所有可測試代碼將保留在一種測試方法中。 – Centurion 2012-04-20 13:12:38

回答

1

如果您不需要延遲執行該操作,您可以:

[[NSOperationQueue mainQueue] addOperationWithBlock:^(void)block] 
2

是否有可能創建一個塊變量選擇接受參數,並將其傳遞給performSelector:withObject:?

號塊和選擇是不一樣的東西。

在你的例子中,它沒有任何意義。 -performSelector:withObject:在同一個線程上同步運行。如果你想要做的塊工作的同時,您可能也只是執行塊即

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

myBlock(@"foo"); 

,你可以使用GCD還是我NSBlockOperation。

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

我不是太肯定所有的內存管理在這裏,所以別人會仔細檢查我這句話。

相關問題