接到任务
虽然做了很多次UISearchbar的搜索,但是这次产品让加一个在输入框下面出一个弹窗能够实现实时搜索功能,并且每次联想3条内容,下面无遮挡,效果类似淘宝的发票页面:
Tips:
千万不要小看实时搜索,暴力测试的时候,一秒钟输入十个字符,调十次接口的话,会被服务端暴打 ( ´▽`) 别问我怎么知道
这里可以利用栈的思想,取到栈顶内容,就可以退出了,这样能节省不少服务器资源
想法
看了下样式之后,脑子里面想了几分钟,就决定先写个manager,接受UITextFieldDelegate的响应,然后调用查询接口,取前3个返回值后,根据textfield的位置,添加一个tableview,自己处理相关event。
注意点
上面提到了,如果什么处理都不做,直接监听UIControlEventEditingChanged,会带来几个问题
- 在输入过程中,输入法会自己在toolbar上有联想,点击联想内容后没有响应
- 输入过快,调用接口过于频繁,造成资源浪费
第一点,比较好处理,delegate回调中判断 · textField.markedTextRange == nil
就可以
第二点,需要着手做两手准备
- 从根源上处理,在每次输入变化的时候,先取消上一次搜索操作,然后做一个延时操作
这样可以初步避免每一次text变化都会出发搜索,只有当输入暂停 的时候,才会触发操作[NSObject cancelPreviousPerformRequestsWithTarget:self]; [self performSelector:@selector(doSomething:) withObject:textField.text afterDelay:0.5];
- 第二点,记录每次搜索内容,防止出现虽然取消了上次操作,但是接口已经返回了而此时又有了新的输入,造成tebleview不断刷新,如果当前block返回的内容是最后一次输入的,才会刷新。我这边是在搜索结果返回触发tableview的时候,判断一下当前持有的context是否是最后一次搜索的,如果是的话才会加载tableview,否则就直接不加载了。