2013-10-25 161 views
0

我試圖立即停止我的NSTimer(不重複),但我不能。 我的NSTimer做下面的代碼:立即停止NSTimer

-(void)timerAction:(NSTimer*)timer{ 
    dispatch_queue_t serverDelaySimulationThread = dispatch_queue_create("com.xxx.serverDelay", nil); 
    dispatch_async(serverDelaySimulationThread, ^{ 
     [NSThread sleepForTimeInterval:2.0]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      //CALL WEBSERVICE RESPONSE IN HERE 
     }); 
    }); 
} 

每次文本框的確發生了變化,我會作廢的NSTimer並重新創建的NSTimer!如果用戶輸入的字符數大於2s的2倍之間的延遲時間,我想要執行一個請求到WEBSERVICES。我的代碼如下

-(void) textFieldDidChange:(id)sender{ 
    [MyTimer invalidate]; 
    MyTimer = nil; 
    MyTimer = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(timerAction:) userInfo:nil repeats:NO]; 
} 

但是,當我在此之後快速鍵入「ABCD」 - > 2s後,4個webservices被調用。 如何停止NSTimer,但它未完成

Tks提前!

回答

1

您的計時器timeInterval設置爲0.所以每次輸入計時器時都會觸發。改變你的代碼看起來像這樣

MyTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 
    target:self selector:@selector(timerAction:) userInfo:nil repeats:NO]; 

,它應該工作:)

+1

在我的NSTimer中,有添加睡眠時間並將其設置爲2秒。如果我應用您的解決方案,它只會將我的睡眠時間增加到4秒。 :) tks –

+0

對不起,我忘了說,當你設置你的計時器timeInterval 2.0秒,你不需要[NSThread sleepForTimeInterval:2.0]; 問題是,當你把你的線程進入睡眠狀態時,你不能取消它,它會在2.0秒後繼續執行。 所以只要刪除NSThread睡眠和設置計時器爲2.0秒,它將工作:) –

+0

哦!如果這個定時器沒有取消,我只想在2秒鐘內等待2s - >打一個WEBSERVICE。 –

0

的問題是要實現textdidchange代表。所以你輸入文字多少次。它會被調用。在裏面你寫了四個字母。所以你的NSTimer絕對是你的網絡服務的四倍。我建議最好使用- (void)controlTextDidEndEditing:(NSNotification *)aNotification這樣,只要你輸入或tabb出你的webservice將被調用。

2
-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    [myTimer invalidate]; 
    myTimer = nil; 
    myTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(timerFired) userInfo:nil repeats:NO]; 
    return YES; 
} 

這對我有效。