条条道路通罗马、选择一条宽敞的大道、前进
方法一:一般的方法
@interface XXX
@property (nonatomic, assign) NSInteger inputCount; //用户输入次数,用来控制延迟搜索请求
@end
- (void)inputBarTextViewDidChange:(HPGrowingTextView *)textView hasInputText:(NSString *)text {
// 用户停止输入1秒后进行提示内容匹配搜索
self.inputCount ++;
[self performSelector:@selector(requestKeyWorld:) withObject:@(self.inputCount) afterDelay:1.0f];
}
- (void)requestKeyWorld:(NSNumber *)count {
if (self.inputCount == [count integerValue]) {
//说明用户停止输入超过了一秒,发起网络请求
[self.searchOperation cancel];
//执行网络请求
self.searchOperation = [HTTP XXX];
}
}
方法二: 使用ReactiveCocoa进行优化了解RAC的可以看一下
参数说明:
throttle: //若一段时间后没有新信号就执行最后这个信号
distinctUntilChanged: //处理解决相同值没必要多次被订阅
ignore: //忽略空值
[[[[self.textField.rac_textSignal throttle:2] distinctUntilChanged] ignore:@""] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
方法三:1秒内取消延迟、1秒后执行延迟
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// 一次取消所有的延迟执行
[NSObject cancelPreviousPerformRequestsWithTarget:self];
NSString *subString = textField.text;
subString = [subString stringByReplacingCharactersInRange:range withString:string];
// 如果1秒内没有没和变化进行延时操作
[self performSelector:@selector(goSearch:) withObject:subString afterDelay:1.f];
return YES;
}
afterDelay:1.f];
主要是以下两行代码:
[NSObject cancelPreviousPerformRequestsWithTarget:self];
//或者[[self class] cancelPreviousPerformRequestsWithTarget:self(请求的目标) selector:@selector(performSelector所注册过的方法名称) object:nil];
[self performSelector:@selector(goSearch:) withObject:subString afterDelay:1.f];
网友评论