所以这是我的问题,我是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秒是非常快的,虽然我正在为每一个进行这些字符串比较。
答案 0 :(得分:2)
Mukhi,
首先,你做过明显的事情并将你的领域编入索引吗?
其次,iOS设备的抓取时间非常慢。这在技术上并不是Core Data的缺陷。 (虽然CD在这里也可能是一个性能吸引人的罪魁祸首。)因此,只要有可能,你应该对RAM进行大量提取并在那里优化搜索。例如,当第一个char是'b'时,获取所有这些,然后从RAM中的该子集中精炼后续类型字符。你会发现这很快。
第三,您所看到的性能变化可能是由于SQLite行缓存以及可能是填充的MOC。
安德鲁
答案 1 :(得分:0)
尝试将获取批量大小从1更改为20.
[request setFetchBatchSize:20];