CoreData难以置信

时间:2013-01-11 23:11:04

标签: core-data

所以这是我的问题,我是iOS CoreData的新手,所以我不确定如何进行优化,但我在这里看到了很多其他问题,并且我试图优化最佳尽我所能,但由于某种原因,它仍然需要将近5秒钟来获取100行! 这是被调用的代码:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    [self titles:searchText];
}
-(NSArray *)titles:(NSString *)toMatch
{
    NSMutableArray * retval = [[NSMutableArray alloc] init];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if(toMatch.length>2)
    {
        NSString *LabelText =toMatch;
        NSString *compareString = @"";
        for (int i = 0; i<LabelText.length; i++)
        {
            int letter = [LabelText characterAtIndex:i];
            NSString *blah;
            if(letter<100)
            {
                blah = [NSString stringWithFormat:@"0"];
                blah = [blah stringByAppendingFormat:@"%d", letter];
            }
            else
                blah = [NSString stringWithFormat:@"%d", letter];
            compareString= [compareString stringByAppendingString:blah];
            compareString = [compareString stringByAppendingString:@","];
        }
        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        [request setEntity:entity];
        NSPredicate *predicate;
        if ([defaults boolForKey:@"FLS"])
            predicate = [NSPredicate predicateWithFormat:@"first_letter_start BEGINSWITH %@", compareString];
        else
            predicate = [NSPredicate predicateWithFormat:@"first_letter_start CONTAINS %@", compareString];
        [request setPredicate:predicate];
        [request setFetchLimit:100];
        [request setFetchBatchSize:1];
        [request setPropertiesToFetch:[NSArray arrayWithObject:@"gurmukhi"]];
        [request setReturnsObjectsAsFaults:NO];
        NSError *error;
        NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:request error:&error];
        for (Gurbani *shabad in fetchedObjects)
        {
            [retval addObject:shabad.gurmukhi];
        }
        searchResults = retval;
        [searchResultsTable reloadData];
    }
    return retval;
};

这是放入调试参数后的日志:

2013-01-11 18:04:57.195 GurbaniKhoj[2833:907] CoreData: sql: pragma cache_size=200
2013-01-11 18:04:57.199 GurbaniKhoj[2833:907] CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA
2013-01-11 18:05:01.139 GurbaniKhoj[2833:907] CoreData: sql: SELECT 0, t0.Z_PK FROM ZSHABAD t0 WHERE  NSCoreDataStringSearch( t0.ZFIRST_LETTER_START, ?, 8, 0)  LIMIT 100
2013-01-11 18:05:06.705 GurbaniKhoj[2833:907] CoreData: annotation: sql connection fetch time: 5.5652s
2013-01-11 18:05:06.707 GurbaniKhoj[2833:907] CoreData: annotation: total fetch execution time: 5.5682s for 92 rows.

发生了什么事?我能做些什么才能让它变得更快?

编辑:我注意到的另一件事是这个速度不一致。对于某些查询,它是5.5秒,而对于其他查询,它是1.8。我不知道是什么导致了波动。

编辑2:想出我的索引没有被创建。创建了一个版本化的数据模型,确保它们已编入索引,现在这就是日志的样子

2013-01-15 03:06:29.671 GurbaniKhoj[1212:907] CoreData: sql: SELECT 0, t0.Z_PK FROM ZSHABAD t0 WHERE  NSCoreDataStringSearch( t0.ZFIRST_LETTER_START, ?, 8, 0)  LIMIT 100
2013-01-15 03:06:31.130 GurbaniKhoj[1212:907] CoreData: annotation: sql connection fetch time: 1.4588s
2013-01-15 03:06:31.132 GurbaniKhoj[1212:907] CoreData: annotation: total fetch execution time: 1.4607s for 92 rows.

编辑3:有什么方法可以让它更快吗?我仍然不觉得1.5秒是非常快的,虽然我正在为每一个进行这些字符串比较。

2 个答案:

答案 0 :(得分:2)

Mukhi,

首先,你做过明显的事情并将你的领域编入索引吗?

其次,iOS设备的抓取时间非常慢。这在技术上并不是Core Data的缺陷。 (虽然CD在这里也可能是一个性能吸引人的罪魁祸首。)因此,只要有可能,你应该对RAM进行大量提取并在那里优化搜索。例如,当第一个char是'b'时,获取所有这些,然后从RAM中的该子集中精炼后续类型字符。你会发现这很快。

第三,您所看到的性能变化可能是由于SQLite行缓存以及可能是填充的MOC。

安德鲁

答案 1 :(得分:0)

尝试将获取批量大小从1更改为20.

[request setFetchBatchSize:20];