【问题标题】:Validate ManagedObject验证 ManagedObject
【发布时间】:2013-03-20 16:39:09
【问题描述】:

我有一个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 个用于检查唯一性的工具提示......而且我必须全部检查。

【问题讨论】:

    标签: ios validation core-data unique nsmanagedobject


    【解决方案1】:

    快速回答,我相信效率更高。使用此代码 sn-p 而不是循环:

    [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;
    }
    

    【讨论】:

    • 还有什么点[request setPredicate:[NSPredicate predicateWithFormat:@"tooltipText IN %@", newTooltips]]; [请求 setResultType:NSDictionaryResultType];我不明白..如果我评论它 - 它工作正常..
    • [request setPredicate:[NSPredicate predicateWithFormat:@"tooltipText IN %@", newTooltips]]; 允许您仅返回那些在 newTooltips 数组中显示字段 'tooltipText' 的项目。
    • [request setResultType:NSDictionaryResultType];[request setPropertiesToFetch:@[@"tooltipText"]]; 结合使用,并允许您仅获取所需的字段以减少内存影响。
    • 使用NSMutableSet 而不是NSMutableOrderedSet。结果会差不多。希望现在更加清晰。
    【解决方案2】:

    您可以尝试通过获取请求的 NSDictionaryResultType 结果类型和 setReturnsDistinctResults:YES 仅获取不同的 tooltipText。然后在内存中搜索结果。这可能比 10k 获取快得多,因为 fetch 总是命中磁盘。 您可以找到更多信息here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      • 2016-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多