我正在使用UITableView与UISearchDisplayController结合来搜索表数据数组。
对于显示的每一行,从网络获取图像并在本地缓存。
问题是当用户键入搜索词时,每个键都会触发对我用来启动在线图像提取的shouldReloadTableForSearchString的调用。如果用户快速键入,它将创建多个网络请求,当网络提取完成时,触发它的行可能不再存在,因为搜索已更改。
我想我需要等到用户在发出网络请求之前停止输入,但是还是找不到使用UISearchBar和UITableView的方法..
任何想法?
答案 0 :(得分:1)
您需要在每次击键时设置一个计时器。假设您假设用户在1秒前收到最后一次击键时已停止输入。您应该安排一个计时器,而不是从shouldReloadTableForSearchString:
返回YES。如果在1秒钟之前收到另一个击键,则使计时器无效并重置。
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
if(myTimer) //a timer is already scheduled. Invalidate it.
{
[myTimer invalidate]; //myTimer is an iVar
myTimer = nil;
}
myTimer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:1] interval:0 target:self selector:@selector(search:) userInfo:searchString repeats:NO];
[[NSRunLoop currentRunLoop] addTimer:myTimer forMode:NSDefaultRunLoopMode];
return NO;
}
- (void)search:(NSTimer*)theTimer
{
//make network request here
}
收到来自网络电话的响应时,请致电[self.searchDisplayController.searchResultsTableView reloadData];
。