2013-10-03 93 views
0

这个问题已经提出了很多,但我似乎无法进一步优化这段搜索代码。使用nspredicates优化查询搜索

此filterSet阵列具有约1000项和它采取在非模拟器iPad的8秒再现结果(仿真示出了在结果小于一第二):

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无法识别的选择器问题(这是说我的数组有NSNumbers而不是NSStrings)

回答

0

所以我的初始算法运行在O(N^2)这是非常糟糕的(现实)。

我已经结束了使用一个NSDictionary映射键/值,这样我可以很容易地内的第一引用它们for循环的第一遍:

的NSMutableDictionary * filteredResultsDict = [[[的NSMutableDictionary的alloc] INIT]自动释放] ;

for (int i = 0; i < [filteredResults count]; i++) { 
    NSString *key = [[filteredResults objectAtIndex:i] valueForKey:@"rowID"]; 
    NSMutableArray *filtersArray = [NSMutableArray array]; 
    NSMutableArray *tempArray = [filteredResultsDict objectForKey:key]; 

    if (tempArray != nil || [tempArray count] > 0) { 
     [tempArray addObject:[filteredResults objectAtIndex:i]]; 
     [filteredResultsDict setValue:tempArray forKey:key]; 
    } 
    else { 
     [filtersArray addObject:[filteredResults objectAtIndex:i]]; 
     [filteredResultsDict setValue:filtersArray forKey:key]; 

    } 
} 

,然后在我的实际for循环,我可以代替以前rowResults的称之为:

NSNumber *rowIDNum = [NSNumber numberWithInteger: [rowID integerValue]]; 
    rowResults = [[filteredResultsDict objectForKey:rowIDNum] valueForKey:@"value"]; 
+0

是什么样你修改后的表现手法? – jbbenni

+1

与931项,初始算法执行并在8.2971秒完成。有了这个优化,它已经减少到1.97秒:) – kevinl