与 iPhone Facebook 应用程序搜索功能类似,我在您将功能输入到我的应用程序时实现搜索,尽管在将数据解码为 JSON 格式时遇到问题。
基本上发生的情况是因为某些搜索比其他搜索花费的时间更长,它们以不同的时间间隔返回,这会在数据显示在屏幕上时导致一些小的视觉问题。
我在每次解码后使用 NSJSONSerialization 为关键字“industry”设置了一个 NSLOG
2013-04-09 23:38:18.941 Project Name [42836:1d03] http://fooWebAddress/json/?method=search&limit=10&q=indus
2013-04-09 23:38:19.776 Project Name [42836:3e07] http://fooWebAddress/json/?method=search&limit=10&q=indu
2013-04-09 23:38:20.352 Project Name [42836:8803] http://fooWebAddress/json/?method=search&limit=10&q=indust
2013-04-09 23:38:21.814 Project Name [42836:4e03] http://fooWebAddress/json/?method=search&limit=10&q=industr
2013-04-09 23:38:23.434 Project Name [42836:8803] http://fooWebAddress/json/?method=search&limit=10&q=ind
2013-04-09 23:38:24.070 Project Name [42836:7503] http://fooWebAddress/json/?method=search&limit=10&q=industry
如您所见,一切都乱了套。
有没有人有办法停止前一个连接的 NSJSONSerialization。
或者可能有任何其他方式来解决这个问题?
升级到 NSJSONSerialization...
- NSURLRequest (initwithURL)
- NSOperationQueue
- NSURLConnection(异步)
- NSJSON序列化
提前致谢。
Best Answer-推荐答案 strong>
当用户开始输入更多文本时,您可以取消之前的连接并忽略您从他们那里收到的任何进一步的委托(delegate)回调。然后对当前文本发出新请求。
您可以通过维护某种 lastRequest 或 lastOperation 引用来做到这一点。当用户开始输入时,调用 [self.lastRequestOrOperation cancel] 并忽略来自该请求的任何进一步通知,并使用类似 if (request != self.lastRequest) { return; } 在你有的任何回调中。
但是,如果用户继续输入一段时间,您会不断取消请求,并且在他们停止输入之前他们可能看不到任何结果。
更好的解决方案是添加排序,以便每个请求与递增的序列 ID 相关联。然后,您仅在响应序列高于您收到的最后一个时解析结果并更新 UI。如果您收到之前的任何带外响应,您只需忽略它们。
关于ios - 取消 NSJSONSerialization - 键入时搜索,请求重叠,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/15903938/
|