2013-03-19 69 views
12

一個方法調用,我知道這可以通過使用來完成:延遲在Objective-C

[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0] 

然而,問題是,我想只有1個的方法調用就可以完成。 使用此功能,呼叫將堆疊在彼此之上。我想打個電話,如果打了另一個電話,第一個電話將被解僱。想法?

+3

'performSelector:withObject:afterDelay:'只執行一次選擇器** **我沒有看到你的問題是什麼。 – 2013-03-19 10:26:46

+1

你是否試圖調用多個'perform',然後只想執行最新的? – 2013-03-19 10:28:50

+0

是的,Inder。正是我想要做的。抱歉不清楚。 – Michael 2013-03-19 10:31:47

回答

14

一旦方法被執行則沒有阻止它的方式。

但是你可以取消它是否被解僱。你可以做這樣的事情

//.... your code 
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil]; 
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]; 
//.... your code 

通過這種方式,你可以取消以前只執行,如果myMethod沒有被解僱的要求。

+0

非常好,謝謝! – Michael 2013-03-19 11:42:07

+0

我完全可以使用你的提示來設置一個增量按鈕(這裏是:UP和DOWN),它不應該將它的數值集轉移到硬件上。每個水龍頭都會重置計時器,直到最後的水龍頭觸發最終值。 – 2016-10-19 13:27:24

13

在代碼段庫中的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#> 
    }); 

不言自明。

+0

+1這正是我一直在尋找的。這個實現非常棒,因爲即使它們有多個參數,它也可以進行完整的方法調用,並且看起來不錯。另外,正如你所說的,對於編碼人員和任何以後的開發人員都是不言而喻的。 – Firo 2013-07-31 21:20:43

2

你應該在其他一些線程中執行這個選擇器,以避免堆棧問題。 使用

[self performSelector:(SEL) onThread:(NSThread *) withObject:(id) waitUntilDone:(BOOL)]; 

在這種選擇,你可以添加任何你想要的延遲。作爲這一進程將在獨立的線程中運行,因此不會阻止別人延遲

2

編輯:現在,我知道你希望只使用最新的,你也可以使用:

[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;