2012-02-22 57 views
6

我使用下面的方法在一個UIView子類:如預期performselector afterdelay不工作

[self performSelector:@selector(timeout) withObject:nil afterDelay:20]; 

的方法,在20秒之後被調用。 在另一種方法我嘗試取消使用下面的代碼執行的請求:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil]; 

我也試過

[NSRunLoop cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil]; 

兩個消息沒有帶來預期的結果的超時方法仍然是調用。 任何人都可以解釋我做錯了什麼,如何正確地做到這一點?來自奧地利 馬丁

歡呼

+0

其工作正常,我只是試過你的代碼 – 2012-02-22 07:07:32

回答

3

兩點
1.都是self相同的對象?
2.是否[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil];在您稱爲[self performSelector:@selector(timeout) withObject:nil afterDelay:20];的同一個線程上執行?

檢查這兩個問題。

1

你可以做到這一點與2種方式:

  1. 您可以使用此這將刪除所有排隊的

    [NSObject的cancelPreviousPerformRequestsWithTarget:自我]。

  2. 可以去掉每一個單獨

    [NSObject的cancelPreviousPerformRequestsWithTarget:自 選擇器:@selector(超時) 對象:無];

3

使用NSTimer作爲實例變量存儲在您的類中。當你想取消執行,無效並銷燬計時器。

在你@interface:

@property (readwrite, retain) NSTimer *myTimer; 

在你的@implementation:

self.myTimer = [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(timeout) userInfo:nil repeats:NO]; 

然後,如果某些條件發生,超時方法不應再被稱爲:

[self.myTimer invalidate]; 
self.myTimer = nil; // this releases the retained property implicitly 
1

試試這個:

[self performSelectorOnMainThread:@selector(timeout) withObject:self waitUntilDone:NO]; 
相關問題