ios - 在 iOS 中使用异步网络调用创建一个预先输入的 UISearchDisplay

标签 ios asynchronous nsurlconnection uisearchdisplaycontroller type-ahead

我的 iOS 应用程序的一个 View 是 UISearchDisplay。我将其设计为预先输入的搜索,这样每当用户输入一个新字符时,表格就会重新填充。我通过实现 UISearchDisplayDelegate 协议(protocol)方法做到了这一点:

searchDisplayController:shouldReloadTableForSearchString:

在这种方法中,我将提供的字符串附加到我的查询 URL 中。然后我创建一个新的 NSURLConnection 并提交一个新的异步请求。我通过委托(delegate)方法接收和附加数据:
connection:didReceiveData:

连接完成下载数据后,通过以下方法:
connectionDidFinishLoading

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

我的问题:如果用户输入文本的速度足够快,就会有多个连接和解析任务同时进行。这是一个问题,因为我有一个 NSMutableData 实例,我将数据附加到并解析。希望你能看到我的目标。

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

最佳答案

NSXMLParser不是异步的。这让很多人感到困惑,因为他们认为这是由于它使用了委托(delegate)回调方法。然而,实际上 parse在所有解析完成之前,方法不会返回。

因此,虽然您可能同时有多个连接,但除非您自己对其进行多线程处理,否则不会发生多个解析操作。

要解决多连接问题,不如每个连接只有一个 NSMutableData,而不是一个?有很多方法可以做到这一点:您可能想查看以下问题的答案以获得想法。

  • Cocoa: Checks required for multiple asynchronous NSURLConnections using same delegate functions?
  • Managing multiple asynchronous NSURLConnection connections
  • 关于ios - 在 iOS 中使用异步网络调用创建一个预先输入的 UISearchDisplay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11469627/

    相关文章:

    ios - 如何在 MKMapView 中找到中国变换的逆?

    javascript - then() 函数是否返回反射(reflect)先前 promise 结果的 promise ?

    objective-c - 在 NSURLConnection block 内返回字符串 - 发送不兼容的 block 指针类型

    objective-c - 从数组中获取 CGRect

    ios - 如何在 ImageView 中裁剪 UIImage

    ios - 如何符合协议(protocol)变量的设置和获取?

    python - 在 Flask 中使用什么库来实现这种异步操作?

    c# - async/await WhenAll 在两个具有相同返回类型的方法上

    iphone - 为什么我应该更喜欢 ASIHTTPRequest 而不是 NSURLConnection 从 Web 下载文件?

    iphone - 从服务器加载表格 View 的 Plist 之前检查互联网