2011-09-03 124 views
0

我正在使用UITableView与UISearchDisplayController在表数据数组上进行搜索。UISearchDisplayController和图像延迟加载

对于显示的每一行,图像从网络中获取并在本地缓存。

问题是当用户输入一个搜索词时,每个键都会触发一个对我用来启动在线图像获取的shouldReloadTableForSearchString的调用。如果用户键入的速度很快,则会创建多个网络请求,到网络提取完成时,触发它的行可能不再存在,因为搜索已更改。

我想我需要等待,直到用户停止使得网络请求前打字,但仍可能找到一种方法用的UISearchBar和的UITableView这样做..

什么想法?

回答

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];