实时搜索(出现的各种问题)

Posted freebreath-stack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实时搜索(出现的各种问题)相关的知识,希望对你有一定的参考价值。

最近公司让做一个实时搜索的功能,我首先想到的就是在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这个错误参数过滤下 是因为你取消了上次的请求返回来的错误信息

以上是关于实时搜索(出现的各种问题)的主要内容,如果未能解决你的问题,请参考以下文章

ES问题

ES问题

《安富莱嵌入式周报》第279期:强劲的代码片段搜索工具,卡内基梅隆大学安全可靠C编码标准,Nordic发布双频WiFi6 nRF7002芯片

非侵入式“实时”帮助系统

从搜索文档中查找最小片段的算法?

永远观察实时数据的片段