2013-03-20 16 views
0

我有一個SearchStringTooltip ManagedObject。有屬性@dynamic tooltipText;(NSString)驗證ManagedObject

我需要在數據庫中動態添加新的工具提示,但我只需要唯一值(不敏感)。

他們可能每次超過100次;每次我檢查獨特的時間..

它看起來像:

if (newTooltips.count == 0) 
     return; 

    NSEntityDescription *entity = [NSEntityDescription 
            entityForName:@"SearchStringTooltip" 
            inManagedObjectContext:self.moc]; 
    NSFetchRequest *request = [NSFetchRequest new]; 
    [request setEntity:entity]; 

     for (NSString *name in newTooltips) { 

     [request setPredicate:[NSPredicate predicateWithFormat:@"tooltipText = %@", name]]; //like = (=) + time *2(sometimes *3) ofcourse i know i need like.. Its insensitive 

     NSInteger count = [self.moc countForFetchRequest:request error:nil]; //But its is very expensive operation expensive 
     if (count > 0) { 
      continue; 
     } 

     DBSearchStringTooltip *tooltip = [NSEntityDescription insertNewObjectForEntityForName:@"SearchStringTooltip" 
                     inManagedObjectContext:self.moc]; 
     tooltip.tooltipText = name; 
    } 

我怎麼能做到這一點更便宜的內存?可以有> 10000個檢查獨特的工具提示...我必須檢查所有。

回答

1

快速回答,我相信更有效率。使用此代碼段代替您的循環:

[request setPredicate:[NSPredicate predicateWithFormat:@"tooltipText IN %@", newTooltips]]; 
[request setResultType:NSDictionaryResultType]; 
[request setPropertiesToFetch:@[@"tooltipText"]]; 

NSArray* result = [self.moc executeFetchRequest:request error:nil]; 
NSArray* existingTooltipNames = [result valueForKey:@"tooltipText"]; 

NSMutableOrderedSet* itemsToAdd = [NSMutableOrderedSet orderedSetWithArray:newTooltips]; 
[itemsToAdd minusSet:[NSSet setWithArray:existingTooltipNames]]; 
for (NSString *name in itemsToAdd) { 
    DBSearchStringTooltip *tooltip = [NSEntityDescription insertNewObjectForEntityForName:@"SearchStringTooltip" inManagedObjectContext:self.moc]; 
    tooltip.tooltipText = name; 
} 
+0

Thx它是完美的.. – 2013-03-21 07:32:22

+0

和[線索] [請求setPredicate:[NSPredicate predicateWithFormat:@「tooltipText IN%@」,newTooltips]]; [request setResultType:NSDictionaryResultType]; 我不明白..如果我評論它 - 它工作正常.. – 2013-03-21 10:26:21

+0

注意:NSMutableOrderedSet iOS 5.0 < – 2013-03-21 10:30:28

1

您可以嘗試通過NSDictionaryResultType獲取請求的結果類型和setReturnsDistinctResults:YES僅提取不同的tooltipText。然後在內存中搜索結果。只要抓取總是碰到磁盤,這可能會比10k抓取快得多。 您可能會找到更多信息here

+0

Thx for your answer。我會讀到它 – 2013-03-21 07:35:44