在Core Data中有效地查找特定对象

时间:2013-10-14 06:19:59

标签: ios objective-c core-data

我有一个递归算法,可以查找单词中的所有子词(下面的算法)。我的算法的问题在于它使用获取请求来发送核心数据,这使得它运行得非常慢。

有没有更好的方法来做到这一点?或者我坚持了更长的时间。

- (NSMutableArray *)subwordPermutations:(NSMutableArray *)permutationArray subWord:  (NSMutableString *) subWord {

    if ([subWord length] == 1)
        return permutationArray;

    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Word"];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"alphaSortedWord == %@", subWord];
    [fetchRequest setPredicate:predicate];

    JGTAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext;

    NSError *error;
    [permutationArray addObjectsFromArray:[managedObjectContext   executeFetchRequest:fetchRequest error:&error]];

    if (error)
        NSLog(@"%@", [error localizedDescription]);

    for (int i = 0; i < [subWord length]; i++) {

        NSMutableString *temp = [NSMutableString stringWithFormat:@"%@", subWord];
        [temp deleteCharactersInRange:NSMakeRange(i, 1)];

        permutationArray = [self subwordPermutations:permutationArray subWord:temp];
    }

   return permutationArray;
}

编辑:我忘了提及,核心数据中的对象有两个字符串属性,单词和按字母顺序排序的单词。

1 个答案:

答案 0 :(得分:0)

似乎您(递归地)创建给定字符串的子字符串以及每个子字符串 执行获取请求以检查该字符串是否在数据库中。

要加快单个获取请求,您可以尝试制作“alphaSortedWord”属性 核心数据模型检查器中的索引

您应该通过批量工作获得性能提升: 首先在数组中收集子候选词候选(可能是100,你必须找出最佳的批量大小),然后用谓词执行获取请求

NSArray *candidates = ...; // array of subword candidates
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"alphaSortedWord IN %@", candidates];

查找数据库中该候选列表的所有单词。 然后创建下一个候选数组并继续。