【发布时间】:2010-12-21 09:57:36
【问题描述】:
在使用大约 100 次查询 sqlite 数据库时,我遇到了一些严重的性能问题。 25k 行。 我想要做的是以下内容:当用户在文本字段中输入内容时,我想在作为键盘的 inputAccessoryView 的表格视图中给他自动完成建议。每次他输入一个新角色时,都会启动 4 个新查询以搜索适当的建议。我使用 GCD 和块在单独的线程中执行此操作。 但是性能太低了。这是一个查询的代码:
- (void) queryDatabase:(NSString *) searchString
{
[self.fetchedResults removeAllObjects];
dispatch_queue_t fetchQueue = dispatch_queue_create("Fetch Queue", NULL);
dispatch_async(fetchQueue,^{
NSError *error = nil;
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
context.undoManager = nil;
[context setPersistentStoreCoordinator: self.persistentStoreCoordinator];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"reducedTownName like %@", [searchString stringByAppendingString:@"*"]];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"Station" inManagedObjectContext:context];
request.fetchLimit = 20;
[request setIncludesPropertyValues:NO];
request.predicate = predicate;
request.resultType = NSManagedObjectIDResultType;
NSArray *results = [context executeFetchRequest:request error:&error];
NSEnumerator *e = [results objectEnumerator];
NSManagedObjectID *objectId = nil;
while (objectId = [e nextObject])
{
Station *station = (Station *) [self.managedObjectContext objectWithID:objectId];
if ( ![self.fetchedResults containsObject:station])
[self.fetchedResults addObject:station];
}
dispatch_async(dispatch_get_main_queue(),^{
[self.tableView reloadData];
});
[request release];
[context release];
});
//do 3 more queries similar to the first (only predicate changes)
dispatch_release(fetchQueue);
}
我使用 NSArray (fetchedResults) 来保存返回的 Entities 并使用该 Array 中的数据更新 tableView。
有人在这段代码中看到了任何性能杀手,或者对我有其他建议吗?
【问题讨论】:
-
性能如何(每个查询以毫秒为单位)?
-
我用 BEGINSWITH 替换了 LIKE,现在查询时间范围从即时到大约 400 毫秒,这在很大程度上是可以接受的。无论如何,我愿意接受进一步提高性能的建议。
标签: iphone performance sqlite core-data