我试图立即停止我的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
});
});
}
每次textField Did Change,我都会使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
提前预约!
答案 0 :(得分: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;
}
这对我有用。
答案 1 :(得分:1)
您的计时器timeInterval设置为0.因此每次键入计时器时都会触发。将代码更改为这样
MyTimer = [NSTimer scheduledTimerWithTimeInterval:2.0
target:self selector:@selector(timerAction:) userInfo:nil repeats:NO];
它应该有效:)
答案 2 :(得分:0)
问题是你正在实现textdidchange委托。那么你输入文字的次数。它会被调用。你在里面写了四封信。所以你的NSTimer绝对是你的网络服务的四倍。我建议最好使用- (void)controlTextDidEndEditing:(NSNotification *)aNotification
这样,无论何时输入或标签都会调用您的网络服务。