我有一个SearchStringTooltip
ManagedObject。使用属性@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个工具提示用于检查独特...我必须检查它们。
答案 0 :(得分:1)
您可以尝试通过获取请求的NSDictionaryResultType
结果类型和setReturnsDistinctResults:YES来仅获取不同的tooltipText。然后在内存中搜索结果。这可能比10k提取快得多,只要提取总是击中磁盘。
您可以找到更多信息here。
答案 1 :(得分: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;
}