2011-02-02 18 views
0

私はNSXMLParserを使って内線を解析します。 APIデータ。また、extton APIから取得した情報を保持するために、シングルトン共有配列varを使用します。重複した検索結果とXMLParser配列リフレッシュの問題

この情報は動的であり、今の事は、私が使用して既存のアレイのコンテンツをオフにクリアし、ユーザーのタイプのものとすぐにある

UISearchBar

でユーザーが何かをchangesas [retrievedArray removeAllObjects]。

これは、検索バーの現在の用語に基づいてretrieveArrayを更新しました。

これは、ユーザーがゆっくり入力すると正常に動作します。しかし、ユーザーが非常に高速に入力すると、重複した検索結果が表示されます。これは、retrieveArrayの内容が消去されるのに十分な時間がないためです。

私はまだこの問題を解決しようとしています。いくつかの修正を提案してください。

私に修正をお願いいたします。

答えて

0

いいえ、別のスレッドで別のスレッドで検索を行い、別のスレッドで配列をクリアしている場合を除き、そうは思われません。そうでない場合は、検索ロジックに誤りがある可能性があります。

+0

@Maxはい、私はスレッド NSAutoreleasePoolを使用*プール=の内容だけをユーザーに更新することができます[NSAutoreleasePool alloc] init]; [self setURL:url]; \t NSThread * myThread = [[NSThread ALLOC] initWithTarget:自己 セレクタ:@selector(実行:) \t \t \t \t \t \t \t \t \t \t \t \tオブジェクト:なし]。 [retrievedArray removeAllObjects]; \t [myThread start]; [プールの解放]; 私はスレッドなしで試してみましたが、それでも高速タイピングで問題は解決しません。 他の修正方法を提案してください。 – testndtv

+0

いいえ、スレッドを使用することはOKです。配列にアクセスするたびに@synchronize(retrievedArray){}を使用するだけです。 – Max

+0

私はあなたに少しトリックを提案することができます:メソッドを定義する - (void)clearArray {@synchronized(retrieveArray){[retrievedArray removeAllObjects]; }}と別のもの、つまり - (void)appendArray {//ここにデータを入れてください} NSLogをそのメソッドに置くと、配列サイズを出力できます。そして、それがいつ変化しているかがわかります。トレッドIDを印刷することもできます。 – Max

0

まず、シングルトンのアプローチが、あなたがやっていることのために行く最善の方法ではないかもしれないと思います。ただし、アレイへのすべての変更可能なアクセスを同期させていることを確認してください。シングルトンがどのオブジェクトに対してもNSMutableArrayを返すのを許可する代わりに、addObjectremoveObjectclear@synchronizeブロックまたは決まった種類のロックを使用する必要があります。 addObject、remove、およびclearを呼び出すコードもすべて同期する必要があるため、このアプローチではまだ問題があります。おそらく、デリゲートを使用するか、タイムスタンプを含むNSNotification、ユーザーがデータを取得するために入力した文字、結果のNSArrayを投稿すると、それぞれの自動完了要求を検討することができます。その時あなたは[応答がまだ有効であるかどうかを確認し、無効な応答を破棄し、最新の有効なNSArray

関連する問題