0

私はSearchStringTooltipManagedObject を持っています。プロパティ@dynamic tooltipText;付き (NSString)

データベースに新しいツールチップを動的に追加する必要がありますが、必要なのは一意の値 (インセンシティブ) だけです。

一度に 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;
    }

どうすればメモリを安くすることができますか?一意のチェックには 10,000 を超えるツールチップが存在する可能性があります...そして、それらすべてをチェックする必要があります。

4

2 に答える 2

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;
}
于 2013-03-20T19:23:59.340 に答える
1

NSDictionaryResultTypeフェッチ要求の結果タイプとsetReturnsDistinctResults:YESを介して、個別のtooltipTextのみをフェッチしようとする場合があります。次に、メモリ内の結果を検索します。フェッチが常にディスクにヒットする限り、これは10kフェッチよりもはるかに高速である可能性があります。あなたはここでより多くの情報を見つけるかもしれません。

于 2013-03-20T17:40:31.970 に答える