我想定義一個選擇器。我怎麼能這樣做?調用目標函數c
即我願做這樣的事情:
[self performSelector:@selector(function() {variable = 3;}) withObject:self afterDelay:3];
其中variable
是類調用函數的一個int。
我想定義一個選擇器。我怎麼能這樣做?調用目標函數c
即我願做這樣的事情:
[self performSelector:@selector(function() {variable = 3;}) withObject:self afterDelay:3];
其中variable
是類調用函數的一個int。
考慮使用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及更高版本。
塊肯定是解決方案的路徑。但是,如OP所示,如何在'performSelector:withObject:afterDelay:'方法中使用上面的塊(不在'printf'中)? – 2012-04-06 10:46:29
而不是調用'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
我認爲你是對的... – 2012-04-06 10:55:14
對於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秒後執行等)
:
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// Insert code here
}];
你可能看看[塊]( http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html) – 2012-04-06 10:39:28