2011-01-31 11 views
4

私のアプリにはUISearchbarがあります。これは動的検索であり、ユーザーがテキストを入力すると、リモートAPI呼び出しを介してリモートデータベースが検索されます(これはRESTによると思います)。遅延UISearchbarの解析

テーブルビューは、ユーザーが入力すると動的に更新されます。私は、XML結果を解析するためにNSXMLParserを使用しています。 (3つのデリゲートメソッド; didStartElement、didEndElement)

場合によっては、結果に重複したエントリが表示されます。 ユーザーがYAHと入力した場合、YAHOOは3-4回表示されます。なぜ私は分からない。

構文解析の回数を減らすか、構文解析を遅らせることで、ユーザーが入力/削除したすべての文字を要求しないようにするにはどうすればよいですか。

これは、問題を解決する可能性があります。

+0

私はあらゆる種類の解決策/可能な修正があります。 – hmthur

+0

可能な修正をいくつか教えてください。 – hmthur

答えて

10

すべての文字に対して1つのクエリを送信するのではなく、リモートAPI呼び出しを送信する前に遅延を導入することができます。

// Whenever UISearchbar text changes, schedule a lookup 
- (void)searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)text { 
     // cancel any scheduled lookup 
     [NSObject cancelPreviousPerformRequestsWithTarget:self]; 
     // start a new one in 0.3 seconds 
     [self performSelector:@selector(doRemoteQuery) withObject:nil afterDelay:0.3]; 
} 
+0

doRemoteQueryの場合、パラメータを渡すにはどうすればいいですか? – hmthur

+0

パラメータを渡してメソッドを記述すると、 '[self performSelector:@selector(doRemoteQuery :) withObject:myObject afterDelay:0.3];' –

+0

のようになります。パラメータを渡す場合は、 'withObject:myParameter' 、 'withObject:nil'の代わりに。注意:この場合、パラメータオブジェクトに使用する保持/解放のメカニズムを慎重に考える必要があるため、メモリをリークしたり、オブジェクトをすぐに解放したりすることはありません。 –

0

ここでは、私のアプリケーションの1つで、Webサービスの結果から重複を取り除くために使用するメソッドの関連部分を示します。

NSMutableArray *mutableResults = [[myResults mutableCopy] autorelease]; 
NSMutableSet *duplicates = [NSMutableSet set]; 
NSMutableIndexSet *indexesToRemove = [NSMutableIndexSet indexSet]; 

for (NSString *result in mutableResults) 
{ 
    if (![duplicates containsObject:result]) 
     [duplicates addObject:result]; 
    else 
     [indexesToRemove addIndex:[mutableResults indexOfObject:object]]; 
} 

[mutableResults removeObjectsAtIndexes:duplicates]; 
return mutableResults; 
+0

あなたのソリューションは、私が探しているものに沿っているようです。しかし、私は質問があります。私は2つのビューを持っています。リスト&詳細。リストビューには検索バーがあり、このリストビューの行はWebサービスの結果からロードされます。ディテールビューは共有シングルトン配列を使用してデータを表示します。 あなたのソリューションはリストビューを修正するようです。詳細ビューについてはどうしたらよいですか? – hmthur

+0

詳細ビューコントローラにデータセット全体へのアクセスを与える代わりに、配列ビューの1つの項目のデータをリストビューから詳細ビューに渡すだけです。 –