首页 > ios 请问如何控制实时网络请求搜索

ios 请问如何控制实时网络请求搜索

如题 我用的是afnetworking这个网络框架 现在做了一个搜索 但是这个搜索是要网络请求的 现在遇到一个这个问题 当我第一个字输入后 它便进行搜索 但是再输入第二字时 会很卡 因为正在请求数据 有时往往第二字输入很久后第一个的搜索结果才出来 有没有什么办法在输入第二字后 断开第一次的请求 马上执行第二次请求 求解答 或者更好的思路 最好有代码 先谢谢了


用 ReactiveCocoa(https://github.com/ReactiveCocoa/ReactiveCocoa).

这里有篇教程实现了类似的功能:http://blog.scottlogic.com/2015/05/15/mvvm-reactive-cocoa-3.html

核心代码如下(主要是加了个 throttle 控制一秒内只能请求一次):


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

没有使用过afnetworking,使用NSSession,但原理差不多.
1.如果在出入第二个字时出现卡顿,可能是你的网络请求和结果解析是在主线程中执行的,这会阻塞UI.先检查网络请求是否是在主线程中执行,如果是,可能需要创建一个新的线程执行网络请求,然后将结果回调.
2.一种是将结果缓存,伪代码

result;    //用于储存请求结果
cache ;    //缓存

Cache()
{
    cache = result;
    延时;  //在延时期间可能发生了新的网络请求
    if (cache  == result){  //是否有新的数据
    解析并展示到UI
    }
    else{
        Cache();
    }
}
//这种我没有实践过,不知道到效果如何.

第二种,参考 函数节流


没什么好办法
连续输入 别 搜索
每次输入后 停1秒 没有输入了再去搜索~


        [self.searchOperation cancel];
        self.searchOperation = [[AFHTTPRequestOperationManager manager] GET:@"your/api"
                                          parameters:@{}
                                             success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {

                                             }
                                             failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) {


                                             }];
【热门文章】
【热门文章】