この問題は何度も取り上げられていますが、この検索コードをこれ以上最適化することはできないようです。
この filterSet 配列には約 1000 個の項目があり、シミュレーター以外の iPad で結果を再現するのに 8 秒かかります (シミュレーターは 1 秒未満で結果を表示します)。
for(NSString *rowID in [self.filterSet array]) {
self.rowResults = [self.filteredResults filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"rowID = %@", rowID]];
self.rowResults = [self.rowResults valueForKey:@"value"];
self.duplicateValueSet = [NSOrderedSet orderedSetWithArray:self.rowResults];
filterCount = [[self.resultsArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF = %@", rowID]] count];
if([self.duplicateValueSet count] != filterCount)
filterCount -= abs([self.duplicateValueSet count] - filterCount);
if(filterCount == matchingCount)
[self.results addObject:rowID];
}
このクエリを最適化するための提案はありますか? 検索の大部分は、すべてのフィルターと述語の並べ替えで取り上げられます。ありがとう。
編集: for ループ内の多くのコードを削除し、原因が最初の行であることがわかりました
self.rowResults = [self.filteredResults filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"rowID = %@", rowID]];
これは何らかの理由で実行に 7 秒かかります。rowID 文字列に一致する述語を作成するためのより高速で効率的な方法はありますか? makeobjectsperformselector NSArray メソッドを使用することを考えましたが、何らかの理由で NSCFNumber 認識されないセレクターの問題が発生します (これは、配列に NSStrings ではなく NSNumbers があることを示しています)。