最近公司让做一个实时搜索的功能,我首先想到的就是在UISearchBar代理方法,把请求放到代理方法里面来做,但是。
问题来了!!!
苹果键盘输入中文的时候有一个展示你拼出来的文字和拼音这么的一个bar
我们的需求就是无论文字字母只要输入到搜索框里才可以搜索,在bar上面的不调用搜索
所以这里我不考虑代理方法----->直接贴代码
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextFieldTextDidChangeNotification object:nil];
这个时候我就可以实时搜索了,也符合要求,但是。
问题又来了!!!
在网好的时候问题看不出来。网不好的时候,我这狂点不同信息来搜索,这里的数据不知道是那次回来的数据,因为请求是异步,所以我这里自己自己写个请求将每次请求的任务放到数组里面 每次在有请求进来 删除上一个请求 就解决问题了 写代码看看
+ (instancetype)sharedSessionTask {
static WSSessionTask *sharedS = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedS = [[super alloc]init];
});
return sharedS;
}
-(void)wsSessionTaskHtttpRequestWithURLString:(NSString *)URLString
Parame:(NSMutableDictionary *)parame
method:(NSString *)method
successful:(void(^)(NSDictionary * _Nullable data))successfulBlock
failure:(void(^)(NSError * _Nullable error))failureBlock {
NSParameterAssert(method);
NSParameterAssert(URLString);
[self.arrayTask enumerateObjectsUsingBlock:^(NSURLSessionDataTask *taskObj, NSUInteger idx, BOOL *stop) {
[taskObj cancel];
}];
[self.arrayTask removeAllObjects];
NSString *urlStr = [NSString stringWithFormat:@"%s%@",PORTOCOL_APP_ADDR,URLString];
NSURL*url=[NSURL URLWithString:urlStr];
NSParameterAssert(url);
//创建请求命令,并设置缓存策略
NSMutableURLRequest *request= [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
request.HTTPBody = [[parame URLRequestHTTPBody] dataUsingEncoding:NSUTF8StringEncoding];
NSString * str =[[NSString alloc] initWithData:request.HTTPBody encoding:NSUTF8StringEncoding];
WSLog(@"--------%@",str);
request.HTTPMethod = method;
//创建会话对象通过单例方法实现
NSURLSession *session=[NSURLSession sharedSession];
//执行会话的任务
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (error.code != -999) {
failureBlock(error);
}
});
}else{
NSDictionary *responData=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
dispatch_async(dispatch_get_main_queue(), ^{
successfulBlock(responData);
});
}
}];
//开始执行任务
[task resume];
[self.arrayTask addObject:task];
});
}
-(NSMutableArray *)arrayTask {
if (!_arrayTask) {
_arrayTask = [NSMutableArray array];
}
return _arrayTask;
}
这里面的返回999这个错误参数过滤下 是因为你取消了上次的请求返回来的错误信息