我正在努力解决一个实现动态搜索的问题。
以下是我想要实现的目标:
在我的应用程序中有一个选项,用户(程序经理)将能够搜索他的团队成员。每个PM在服务器端(web服务)都有自己的帐户,其中是一个表team_members,其中包含与该经理相对应的所有团队成员。
它们的数量可以超过数百个。
我开发的客户端应用程序有一个搜索团队成员的选项。
我想动态地实现它:
例如,当用户打印第一个字母a
时,我向服务器查询,得到所有匹配的字母: Antuan,BArrow等。
然后,用户print ab
和我进行查询,该查询必须返回亚伯拉罕、阿不都拉等。所有匹配结果都显示在UITableView
中。
每次在UITextField
中发送文本时,都会向服务器发出HTTP查询。我用dispatch_async
实现了它:在UITextFieldTextDidChangeNotification
上,我创建了一个dispatch_async
,在其中我用searchbar.text
发出了一个HTTP请求。
问题是:它的运行速度非常慢。我经常得到一个异常的bad selector was sent to the instance
。
所以我的问题是:
为什么我的方法不好?对此有什么更好的解决方案?
或者动态搜索,这是一个非常糟糕的想法,我必须在点击某个按钮后才能进行搜索?
谢谢。我希望一些有经验的iOS开发人员能给我一些好的建议。
发布于 2013-08-01 12:41:07
每次有人输入字符时发出HTTP请求可能永远不会足够快(这也没有真正的意义--继续读下去)。对于特定大小的列表,答案是在您呈现字段时(但在用户开始键入该字段之前)在后台拉出整个列表。一旦您有了列表,您就可以在内存中开始在本地设备上进行匹配。“超过数百个”并不是很具体,这取决于网络速度,但我猜如果您的列表的有效负载大小小于50K,那么拉出整个列表将是最简单的方法。
如果列表太大而不切实际,但是受用户输入的第一个字符限制的列表不是太大,那么最好的方法可能是等待第一个字符,异步触发HTTP请求,并且只有在收到包含以该字母开头的所有项的响应后才启动动态匹配。要记住的一件事是:如果列表由第一个字符限制,这是您必须发出的唯一HTTP请求(除非用户更改了第一个字符),因为以该字母开头的所有可能性都将在该列表中。在此基础上,您可以在本地缩减列表,而无需进一步的HTTP请求。
至于为什么会出现异常,如果不看实际代码就很难说。尝试在Xcode中设置异常断点。这将允许您在抛出异常时在调试器中停止,这将向您显示导致异常的原因。
https://stackoverflow.com/questions/17990755
复制相似问题