2013-10-03 91 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