Основные данные очень медленные на iPad - PullRequest
2 голосов
/ 05 мая 2011

У меня следующий запрос на выборку Core Data, запущенный на iPad с использованием iOS 4.3.2.

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          @"feed.account.name == %@ AND feed.feedType == %@", accountName,feedType];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" 
                                                               ascending:NO];

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

fetchedResultsController=[self createFetchedResultsController:@"RssFeedItem"  predicate:predicate sortDescriptors:sortDescriptors];

[fetchedResultsController.fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"url",@"headline",@"isRead",@"origin",@"originId",@"date",nil]];


[fetchedResultsController.fetchRequest setFetchLimit:500];

[fetchedResultsController setDelegate:self];

[fetchedResultsController performFetch:&error];

return [fetchedResultsController fetchedObjects];

У меня около 688 строк данных в базе данных SQLite для таблицы RssFeedItem и менее 100 строк во всехдругие таблицы.Этот запрос регистрируется с использованием журнала отладки как:

CoreData: sql: SELECT t0.Z_ENT, t0.Z_PK, t0.ZURL, t0.ZHEADLINE, t0.ZISREAD, t0.ZORIGIN,           
CoreData: annotation: sql connection fetch time: 3.3854s
CoreData: annotation: total fetch execution time: 3.4178s for 688 rows.

И он выполняется очень медленно (более 3 секунд).У меня есть индексы на все необходимые поля поиска и поля сортировки.Я предполагаю, что, возможно, двухстороннее соединение делает это медленным, но не уверен, почему это будет так медленноЕсть ли способ оптимизировать этот код или запрос, или я должен рассмотреть что-то еще?

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

Полагаю, что строки, замедляющие ваш запрос, равны

 [fetchedResultsController.fetchRequest setPropertiesToFetch:[NSArray 
 arrayWithObjects:@"url",@"headline",@"isRead",@"origin",@"originId",@"date",nil]];

и

[fetchedResultsController.fetchRequest setFetchLimit:500];

Мне любопытно, зачем вам получать все эти свойства (и 500 предметов) одновременно?

1 голос
/ 05 мая 2011

Это кажется немного медленным. Я не знаю, будет ли это иметь огромное значение для скорости, но это должно немного помочь, переделайте свой предикат как:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"feed.feedType == %@ AND feed.account.name == %@", feedType, accountName];

Вы хотите сначала поставить самое дешевое условие, чтобы не во всех случаях проверять более дорогое условие. Объединение, которое происходит с проверкой имени учетной записи, намного дороже. Кроме того, в зависимости от того, как выглядит значение типа фида, может быть быстрее переключить его на целое число (я предполагаю, что в настоящее время это строка, поскольку это объект).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...