1.实现原理是:将源数据转化为拼音、首字母等临时字符串,将搜索内容与这个临时字符串比对进行搜索。
比如:源数据“艾美”,会转化为临时字符串“#aimei,ai#mei,#am,#艾美”。
拼音转化方法实现:
-(NSString*)transformToPinyin:(NSString *)aString{
//转成了可变字符串
NSMutableString *str = [NSMutableString stringWithString:aString];
CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO);
//再转换为不带声调的拼音
CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformStripDiacritics,NO);
NSArray *pinyinArray = [str componentsSeparatedByString:@" "];
NSMutableString *allString = [NSMutableString new];
int count = 0;
for (int i = 0; i < pinyinArray.count; i++){
for(int i = 0; i < pinyinArray.count;i++){
if (i == count) {
[allString appendString:@"#"];
//区分第几个字母
}
[allString appendFormat:@"%@",pinyinArray[i]];
}
[allString appendString:@","];
count ++;
}
NSMutableString *initialStr = [NSMutableString new];
//拼音首字母
for (NSString *s in pinyinArray){
if (s.length > 0){
[initialStr appendString: [s substringToIndex:1]];
}
}
[allString appendFormat:@"#%@",initialStr];
[allString appendFormat:@",#%@",aString];
return allString;}
2.输入关键字进行搜索:
注意:为避免搜索过程中卡顿,一定要在子线程中调用哈
-(void)searchRealText:(NSString *)text{
[self.resultList removeAllObjects];
dispatch_queue_t searchQueue = dispatch_queue_create("searchs.movie.device", DISPATCH_QUEUE_SERIAL);
dispatch_async(searchQueue, ^{
for (KGMInputModel* model in self.inputList) {
NSString* pinyin = [NSString transformToPinyin:model.v_device_input_name];
if ([pinyin rangeOfString:text options:NSCaseInsensitiveSearch].length>0) {
[self.resultList addObject:model];
}
}
dispatch_async(dispatch_get_main_queue(), ^{
//刷新界面
});
});
}
3.实时搜索:节流,我这里用的是RAC
@weakify(self);
[[[self.textField.rac_textSignal distinctUntilChanged] throttle:0.5] subscribeNext:^(NSString * _Nullable text) {
@strongify(self);
if (self.searchTextReturn) {
self.searchTextReturn(text);
}}];
4.拖拽滑动收键盘
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;