2

iPhone の Facebook アプリの検索機能と同様に、データを JSON 形式にデコードするときに問題がありますが、機能をアプリケーションに入力するときに検索を実装しています。

基本的に何が起こるかというと、一部の検索は他の検索よりも時間がかかり、返される間隔が異なり、データが画面に表示されるときに小さな視覚的な問題が発生するためです。

キーワード「industry」の NSJSONSerialization を使用して、各デコード後に 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 へのステップアップ...

  1. NSURLRequest (initwithURL)
  2. NSOperationQueue
  3. NSURLConnection (非同期)
  4. NSJSONシリアル化

前もって感謝します。

4

4 に答える 4

1

ユーザーがさらにテキストを入力し始めたら、以前の接続をキャンセルして、それらから受け取ったデリゲート コールバックを無視することができます。次に、現在のテキストに対して新しいリクエストを作成します。

lastRequestこれは、何らかのlastOperation参照を維持することで実行できます。ユーザーが入力を開始したら、コールバックを呼び出し[self.lastRequestOrOperation cancel]て、そのリクエストからのそれ以降の通知を無視しif (request != self.lastRequest) { return; }ます。

ただし、これには問題があります。ユーザーがしばらく入力し続けると、常に要求がキャンセルされ、入力を停止するまで結果が表示されない可能性があります。

より良い解決策は、シーケンスを追加して、各リクエストが増加するシーケンス ID に関連付けられるようにすることです。次に、応答のシーケンスが最後に受信したシーケンスよりも高い場合にのみ、結果を解析して UI を更新します。以前から帯域外の応答を受け取った場合は、それらを無視します。

于 2013-04-09T14:18:49.933 に答える
0

ちょっと基本的ですが、サブクラス化された NSURLRequests (タグを提供するためにサブクラス化されたもの) の nsdictionary を常に維持できます。

リクエストの開始 - tag = array.count - 1 で dicationary にリクエストを追加し、キーに一致するタグを付けます結果を表示します。そうでない場合は、以前の結果が表示されていない場合にのみ表示します リクエスト処理 - 辞書からキーを削除します

最新のリクエスト = ディクショナリには、より高いキー値を持つオブジェクトが含まれていますか

于 2013-04-09T14:19:15.317 に答える
0

これは、単にキャンセルできることよりもはるかに複雑な問題ですNSJSONSerialization。私の提案はNSFetchedResultsController、検索結果を表示するテーブル ビューを作成するために使用することです。NSFetchRequestに添付されている述語変数の 1 つとして検索語を使用しますNSFetchedResultsController。次に、 を使用して結果を解析するときに、NSJSONSerializationその要求に関連付けられた検索語とともに結果を保存します。検索用語が変更されたらすぐに (ユーザーがさらに文字を入力したときに検出できます)、 を再作成しNSFetchedResultsControllerてテーブル ビューをリロードします。さらに、performSelector:withObject:afterDelay を使用して起動した場合は、呼び出しをキャンセルして以前の結果を解析することもできます。キャンセルしようとしているときまでに通話が開始されている可能性があるため、これは常に信頼できるとは限らないことに注意してください.

于 2013-04-09T14:18:07.750 に答える