У меня есть серьезные проблемы с производительностью при запросе базы данных sqlite с прибл. 25к строк. Я хочу сделать следующее: когда пользователь вводит что-то в текстовое поле, я хочу дать ему предложения автозаполнения в табличном представлении, которое является 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) для хранения возвращенных сущностей и обновления tableView данными из этого массива.
Видит ли кто-нибудь убийцу производительности в этом коде или может дать мне другой совет?
Station *station = (Station *) [self.managedObjectContext objectWithID:objectId];
, в каком потоке она будет работать? 22.12.2010