一個方法調用,我知道這可以通過使用來完成:延遲在Objective-C
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]
然而,問題是,我想只有1個的方法調用就可以完成。 使用此功能,呼叫將堆疊在彼此之上。我想打個電話,如果打了另一個電話,第一個電話將被解僱。想法?
一個方法調用,我知道這可以通過使用來完成:延遲在Objective-C
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]
然而,問題是,我想只有1個的方法調用就可以完成。 使用此功能,呼叫將堆疊在彼此之上。我想打個電話,如果打了另一個電話,第一個電話將被解僱。想法?
一旦方法被執行則沒有阻止它的方式。
但是你可以取消它是否被解僱。你可以做這樣的事情
//.... your code
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil];
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0];
//.... your code
通過這種方式,你可以取消以前只執行,如果myMethod
沒有被解僱的要求。
非常好,謝謝! – Michael 2013-03-19 11:42:07
我完全可以使用你的提示來設置一個增量按鈕(這裏是:UP和DOWN),它不應該將它的數值集轉移到硬件上。每個水龍頭都會重置計時器,直到最後的水龍頭觸發最終值。 – 2016-10-19 13:27:24
在代碼段庫中的Xcode中,你可以找到一個名爲GCD:調度後,它看起來像這樣:
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
<#code to be executed on the main queue after delay#>
});
不言自明。
+1這正是我一直在尋找的。這個實現非常棒,因爲即使它們有多個參數,它也可以進行完整的方法調用,並且看起來不錯。另外,正如你所說的,對於編碼人員和任何以後的開發人員都是不言而喻的。 – Firo 2013-07-31 21:20:43
你應該在其他一些線程中執行這個選擇器,以避免堆棧問題。 使用
[self performSelector:(SEL) onThread:(NSThread *) withObject:(id) waitUntilDone:(BOOL)];
在這種選擇,你可以添加任何你想要的延遲。作爲這一進程將在獨立的線程中運行,因此不會阻止別人延遲
編輯:現在,我知道你希望只使用最新的,你也可以使用:
[self cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil];
見this link獲取更多信息。
原貼:
你可能只需要被設置爲NO一個BOOL當它到達部分和執行方法之後,然後重置爲YES。
因此,舉例來說,它看起來是這樣的:
if (boolVal) {
boolVal = NO;
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0];
}
然後在myMethod的,有:
boolVal = YES;
'performSelector:withObject:afterDelay:'只執行一次選擇器** **我沒有看到你的問題是什麼。 – 2013-03-19 10:26:46
你是否試圖調用多個'perform',然後只想執行最新的? – 2013-03-19 10:28:50
是的,Inder。正是我想要做的。抱歉不清楚。 – Michael 2013-03-19 10:31:47