objective-c - ios 请问如何控制实时网络请求搜索
PHP中文网
PHP中文网 2017-04-17 16:42:48
[iOS讨论组]

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

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(6)
黄舟

用 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];
    }
}
PHPz

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

PHPz

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

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

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

第二种,参考 函数节流

阿神

可以让服务器返回的结果带上当时这个请求的搜索内容。
在请求返回回调中,判断一下,如果这个请求的返回的搜索内容与当前搜索框的内容一致,才去处理其他内容(刷新页面)。

这样就可以做到实时搜索。

ringa_lee
        [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) {


                                             }];
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号