0

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が変更されるたびに、NSTimerを無効にしてNSTimerを再作成します!! 2秒以上のユーザー入力文字の2倍の遅延時間があれば、WEBSERVICESへのリクエストを実行したいだけです。私のコードは次のとおりです

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

しかし、「ABCD」とすばやく入力すると、その後 2 秒後に 4 つの Web サービスが呼び出されました。未完成の状態で NSTimer を停止するにはどうすればよいですか

よろしくお願いします!

4

3 に答える 3

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

これは私にとってはうまくいきました。

于 2013-10-25T12:57:47.197 に答える
1

タイマーの timeInterval が 0 に設定されているため、入力するたびにタイマーが起動します。コードを次のように変更します

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

そして、それはうまくいくはずです:)

于 2013-10-25T12:41:40.040 に答える
0

問題は、textdidchange デリゲートを実装していることです。では、テキストを入力する回数。呼び出されます。その中にあなたは4文字書いています。したがって、NSTimer が Web サービスを 4 回呼び出していることは間違いありません。- (void)controlTextDidEndEditing:(NSNotification *)aNotification入力またはタブアウトするたびにWebサービスが呼び出されるように、使用することをお勧めします。

于 2013-10-25T12:55:18.830 に答える