2012-04-06 85 views
1

我想定義一個選擇器。我怎麼能這樣做?調用目標函數c

即我願做這樣的事情:

[self performSelector:@selector(function() {variable = 3;}) withObject:self afterDelay:3]; 

其中variable是類調用函數的一個int。

+0

你可能看看[塊]( http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html) – 2012-04-06 10:39:28

回答

2

考慮使用blocks

int multiplier = 7; 
int (^myBlock)(int) = ^(int num) 
{ 
    return num * multiplier; 
}; 

printf("%d", myBlock(3)); 
// prints "21" 

蘋果很多操作提供基於塊的API,其中@選擇回調在過去是唯一的選擇。請注意,塊僅適用於iOS 4.0和更高版本(儘管存在some solutions允許在較早的iOS版本中使用基於塊的代碼)。

編輯:增加了一個給定的時間後調用塊的更加「真實世界」例如:

dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC); 
dispatch_queue_t queue = dispatch_get_main_queue(); 
dispatch_after(delay, queue, ^{variable = 3}); 

注意,此示例使用grand central dispatch這也只能適用於iOS 4.0及更高版本。

+0

塊肯定是解決方案的路徑。但是,如OP所示,如何在'performSelector:withObject:afterDelay:'方法中使用上面的塊(不在'printf'中)? – 2012-04-06 10:46:29

+1

而不是調用'performSelector:withObject:afterDelay:',你可以使用Grand Central Dispatch(它也是一個iOS> = 4.0的特性)並且寫下如下內容:'dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW,seconds * NSEC_PER_SEC) ; dispatch_queue_t queue = dispatch_get_main_queue(); dispatch_after(delay,queue,block);' – 2012-04-06 10:50:08

+0

我認爲你是對的... – 2012-04-06 10:55:14

0

對於GCD參與這樣一個不平凡的任務額外的努力,你不妨創建一個單獨的方法:

- (void) setVariable:(NSNumber *) value 
{ 
    variable = [value intValue]; 
} 

- (void) someOtherMethod 
{ 
    [self performSelector:@selector(setVariable:) withObject:[NSNumber numberWithInt:3] afterDelay:3.0]; 
} 

可能使用的塊或GCD,但是這給你一個解決方案加上向後兼容性。唯一的缺點是,performSelector:withObject:afterDelay:沒有嘗試這個最佳分辨率(例如,它可以3.2秒後執行等)

0

[[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
    // Insert code here 
}];