2013-11-27 27 views
2

我想在2.0秒後執行方法,但我希望能夠取消它,如果在5秒之前,如果另一個調用,但我注意到cancelPreviousPerformRequestsWithTarget發送對象nil和performSelector發送對象NSString執行延遲後的方法並取消它

它會產生問題嗎?

-(void)startRecord:(NSString*)name { 
    if (self.needToStartRecording) { 
     //Cancel last call 
     [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(startRecordAfterDelay:) object:nil]; 
    } 
    self.needToStartRecording = YES; 

    [self performSelector:@selector(startRecordAfterDelay:) withObject:name afterDelay:5.0]; 
} 

-(void)startRecordAfterDelay:(NSString*)name { 
    self.needToStartRecording = NO; 

    //Do My Stuff 
} 
+0

http://stackoverflow.com/questions/3649273/iphone-how-to-cancel-stop-performselector – Rushabh

回答

6

根據該文件,如果你傳遞nil,只有nil執行的請求將被取消。你應該在某個地方存儲以前的值。

以前使用performSelector註冊的請求的參數:withObject:afterDelay:instance方法。使用isEqual:來確定參數的相等性,因此該值不需要與最初傳入的對象相同。通過零來匹配最初作爲參數傳遞的nil請求。

Additionaly,如果你只有這個選擇與延遲使用,你可以調用

[NSObject cancelPreviousPerformRequestsWithTarget:self] 

這將取消發送到自己以前的所有要求

0

您可以手動執行此操作:

爲您的代碼添加一個BOOL值,默認值爲NO,如果另一個呼叫將其值更改爲YES

並在您的startRecordAfterDelay:(NSString*)name方法中,檢查BOOL的值,如果它是NO,則繼續操作,else忽略該調用。