ios obj-c 延迟时间后没收到通知就执行操作

不论是在android还是ios,都会有个问题,就是根据输入框内容进行接下来操作,如果是请求网络数据的话,那么随时改变文本内容就直接请求网络的话,想象一下,快速删除文本,几十毫秒删掉一个字符串,然后请求一下网络,那么会造成服务器的负担,而且还可能会出现数据错乱。

所以这时候就出现了该需求,就是在用户一段时间不进行频繁操作之后就执行最后的操作。

android方面可以用handler和message配合使用。(后面如果有人需求的话,我可以贴出来)

ios这一块呢,不是特别熟练,所以根据逻辑,我只需要在网上找到一个可以延迟执行的操作就行了,剩下的我改改就行了。接下来我用计时器Timer,和UITextField作为例子。

这里的textFieldDidChange方法比较特别一点,并不是UITextField的委托协议里面的方法,而是要自己添加事件来的。如下

[self.textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

添加了事件后,每一次输入都会回调下面的方法。如下

//监听文本变化的方法
-(void)textFieldDidChange:(UITextField*)textField{
    //NSLog( @"text changed: %@", textField.text);

    //一秒之后没操作才执行delayMethod方法
    if (timer!=nil) {
        [timer invalidate];
        timer=nil;
    }
    timer=[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];


}

来看看上面的代码,timer定义为全局对象,然后改变文本内容之后进行判断是否初始化过,如果是,那么重置为空对象,然后重新初始化计时器timer,让其重新计时一秒,然后会在文本改变后一秒内不改变之后进行操作。

看看timer的初始化方法,第一个参数是延迟的时间(CGFloat);第二个参数是执行的对象;第三个参数是延迟后需要执行的方法,这里说一下,如果该方法是需要传数据过去的话,方法名需要带冒号,这里没有传数据就直接方法名;第四个不清楚,猜想是传数据用的;第五个是判断是否需要重复执行,这里不需要。

然后就这么简单的实现了,这是我简单的实现而已,因为对ios还不是特别的熟练,所以只能用一些普遍的方法实现自己的一些需求,如果有更好的方法,可以告知一下。

猜你喜欢

转载自blog.csdn.net/chen_xi_hao/article/details/77159840