iOS开发Tips

iOS-及时搜索的三种优化方法(为减轻服务器的压力)

2018-07-10  本文已影响231人  Simple_Code

条条道路通罗马、选择一条宽敞的大道、前进

方法一:一般的方法

@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];
上一篇 下一篇

猜你喜欢

热点阅读