如题 我用的是afnetworking这个网络框架 现在做了一个搜索 但是这个搜索是要网络请求的 现在遇到一个这个问题 当我第一个字输入后 它便进行搜索 但是再输入第二字时 会很卡 因为正在请求数据 有时往往第二字输入很久后第一个的搜索结果才出来 有没有什么办法在输入第二字后 断开第一次的请求 马上执行第二次请求 求解答 或者更好的思路 最好有代码 先谢谢了
如题 我用的是afnetworking这个网络框架 现在做了一个搜索 但是这个搜索是要网络请求的 现在遇到一个这个问题 当我第一个字输入后 它便进行搜索 但是再输入第二字时 会很卡 因为正在请求数据 有时往往第二字输入很久后第一个的搜索结果才出来 有没有什么办法在输入第二字后 断开第一次的请求 马上执行第二次请求 求解答 或者更好的思路 最好有代码 先谢谢了
@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();
}
}
//这种我没有实践过,不知道到效果如何.
第二种,参考 函数节流
可以让服务器返回的结果带上当时这个请求的搜索内容。
在请求返回回调中,判断一下,如果这个请求的返回的搜索内容与当前搜索框的内容一致,才去处理其他内容(刷新页面)。
这样就可以做到实时搜索。
[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) {
}];
2 回答1.1k 阅读
1 回答995 阅读✓ 已解决
1 回答2.7k 阅读
1 回答1.4k 阅读
1.7k 阅读
1 回答1.1k 阅读
1.3k 阅读
用 ReactiveCocoa(https://github.com/ReactiveCocoa/ReactiveCocoa).
这里有篇教程实现了类似的功能:http://blog.scottlogic.com/2015/05/15/mvvm-reactive-cocoa-3.html
核心代码如下(主要是加了个 throttle 控制一秒内只能请求一次):