2

我的iOS应用程序的一个视图是UISearchDisplay。我将其设计为一种提前输入搜索,以便每当用户输入一个新字符时,该表就会重新填充。我已经通过实现UISearchDisplayDelegate协议的方法,这样做:在iOS中使用异步网络调用创建提前输入的UISearchDisplay

searchDisplayController:shouldReloadTableForSearchString: 

在这种方法我把所提供的字符串,并将其添加到我的查询网址。然后我创建一个新的NSURLConnection并提交一个新的异步请求。我接收并经由委托方法附加数据:一旦连接已完成下载数据

connection:didReceiveData: 

,通过该方法:

connectionDidFinishLoading 

我将数据传递到的NSXMLParser的一个实例。接收到的数据是我数据库中与给定字符串匹配的所有联系人的XML文件。数据完成解析后,我重新加载表格。

我的问题:如果在文本中的用户类型的速度不够快,就会出现在同一时间正在进行多个连接和分析任务。这是一个问题,因为我有一个NSMutableData实例,我将数据附加到并解析。希望你能看到我要去的地方。

有没有人有任何改善我的实施和/或解决这个关键部分问题的建议?

回答

0

NSXMLParser不是异步的。这个人绊倒了很多人,因为他们认为这是由于它使用委托回调方法。但是,实际上,parse方法在所有解析完成之后才会返回。

因此,尽管您可能一次执行多个连接,但除非自己多线程处理,否则不会发生多个分析操作。

为了解决多重连接问题,怎么样,而不是有一个单一的NSMutableData你有每个连接一个?有很多方法可以做到这一点:你可能想看看以下问题的答案。

-1

有一个在Cancellable asynchronous searching with UISearchDisplayController

解决方案的要点描述一个很好的实现是这样的:

  • 创建NSOperationQueue实例,其中哟您将执行您的搜索操作并将其保存到您的UISearchDisplayDelegate实施的属性中,我们将其命名为searchQueue

  • 实施searchDisplayController:shouldReloadTableForSearchString:方法。请注意,此方法返回一个BOOL值,该值指示UISearchDisplayController实例重新加载表视图。该方法可以实现像这样:

    -(BOOL)searchDisplayController:(UISearchDisplayController *)controller 
    shouldReloadTableForSearchString:(NSString *)searchString { 
        if ([searchString isEqualToString:@""] == NO) { 
         [self.searchQueue cancelAllOperations]; 
         [self.searchQueue addOperationWithBlock:^{ 
    
          NSArray *results = // fetch the results from 
          // somewhere (that can take a while to do) 
    
          // Ensure you're assigning to a local variable here. 
          // Do not assign to a member variable. You will get 
          // occasional thread race condition related crashes 
          // if you do.    
    
          [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
          // Modify your instance variables here on the main 
          // UI thread. 
          [self.searchResults removeAllObjects]; 
          [self.searchResults addObjectsFromArray:results]; 
    
          // Reload your search results table data. 
          [controller.searchResultsTableView reloadData]; 
          }]; 
         }]; 
    
         return NO; 
    
        } else { 
         [self.searchResults removeAllObjects]; 
         return YES; 
        } 
    } 
    
  • 不要忘记,当用户退出搜索UI取消任何挂起操作。

     - (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller { 
         [self.searchQueue cancelAllOperations]; 
        }