1

我正在努力解决实现动态搜索的问题。

这是我想要实现的目标:

在我的应用程序中有一个选项,用户(项目经理)将能够搜索他的团队成员。每个 PM 在服务器端(Web 服务)都有自己的帐户,其中它是一个表 team_members,其中包含与该经理对应的所有团队成员。
他们的数量可以超过数百。

我开发的客户端应用程序有一个选项搜索团队成员。
我想动态实现它:
例如,当用户打印第一个字母时,a我向服务器查询并获取所有与字母匹配的内容:Antuan、BArrow 等。

然后用户打印ab,我进行查询,该查询必须返回亚伯拉罕、阿卜杜拉等。等等。所有匹配结果显示在 中UITableView
每次使用UITextFieldshanges 文本时都会对服务器进行 HTTP 查询。我用它来实现它dispatch_async:在UITextFieldTextDidChangeNotification我创建一个dispatch_async我用它发出 HTTP 请求的地方searchbar.text

问题:它工作得非常慢。我经常遇到异常bad selector was sent to the instance

所以我的问题
是:为什么我的方法不好?对此有什么更好的解决方案?
或者动态搜索这是一个非常糟糕的主意,我必须只在单击某个按钮时进行搜索?

谢谢。希望有经验的iOS开发者能给我好的建议。

4

1 回答 1

2

每次有人键入字符时发出 HTTP 请求可能永远不会足够快(也没有真正意义——请继续阅读)。对于特定大小的列表,答案是在您呈现字段后(但在用户开始输入之前)在后台拉出整个列表。获得列表后,您可以在本地设备的内存中开始匹配。“超过数百”不是很具体,它取决于网络速度,但我猜如果您的列表的有效负载大小小于 50K,那么拉整个东西将是最简单的方法。

如果列表太大而不实用,但受用户键入的第一个字符限制的列表不是太大,那么最好的方法可能是等待第一个字符,异步触发 HTTP 请求,并且只收到包含以该字母开头的所有项目的响应后,开始动态匹配。要记住的一件事是:如果您的列表受第一个字符的限制,那是您必须发出的唯一 HTTP 请求(除非用户更改第一个字符),因为以该字母开头的所有可能性都在那个列表。从那里,您可以在本地减少列表,而无需任何进一步的 HTTP 请求。

至于为什么会出现异常,如果没有看到您的实际代码就很难说。尝试在 Xcode 中设置异常断点。这将允许您在抛出异常时在调试器中停止,这将向您显示导致它的原因。

于 2013-08-01T12:41:06.773 回答