Я использую parse в качестве облачного хранилища в сочетании с локальным хранилищем данных для общего доступа. Я обнаружил, что запрос на локальное хранилище данных занимает намного больше времени, чем я ожидал. Это особенно заметно при использовании данных для заполнения таблиц или обновления графических представлений. Эквивалентные функции в coredata близки к мгновенным, и результаты очень хорошие. Хотя я не ожидаю производительности coredata, он намного медленнее, чем я мог ожидать для автономного доступа, и мне интересно, не делаю ли я что-то неправильно?Анализ производительности локального хранилища данных
Ниже приведен пример запроса:
PFQuery *query = [PFQuery queryWithClassName:LOCATION_OBJECT];
[query fromLocalDatastore];
[query whereKey:MESSAGE_TO_FIELD equalTo:user.username];
[query orderByDescending:CREATED_FIELD];
NSLog(@"Query started");
NSArray* res = [query findObjects];
NSLog(@"Query finished, found %lu objects", (unsigned long)[res count]);
Выполнение на 2015 IPad мини рода таймингами я вижу следующим образом:
2015-06-16 18:56:38.883 app[1744:1668474] Query started
2015-06-16 18:56:38.885 app[1744:1668474] Warning: A long-running operation is being executed on the main thread.
Break on warnBlockingOperationOnMainThread() to debug.
2015-06-16 18:56:39.177 app[1744:1668474] Query finished, found 17 objects
Я понимаю, что Анализировать предлагает гораздо больше, чем просто база данных, тем не менее этот запрос занимает 0.292 сек., который кажется возрастом. Для моего приложения я использую эту операцию довольно часто, когда пользователь перемещается по экрану. Результаты были превосходными, а Parse отставание очень заметно. Стоит отметить, что результаты аналогичны на симуляторе. Проблемы с синтаксическим выпуском, когда вы делаете такие вещи, не обнадеживают, но в любом случае мои вопросы в два раза:
1) Пропустили ли я какие-либо корректировки/настройки производительности в Parse? 2) Имеют ли другие люди, которые использовали Parse, аналогичную работу или имеют какие-либо советы?
На данный момент, похоже, мне нужно будет использовать coredata в приложении и написать свои собственные подпрограммы, чтобы подтолкнуть эти данные к облаку Parse, что намного больше, чем я надеялся.
Спасибо за ваше время.
Update 30Jun15
Спасибо за комментарии, в соответствии с этими замечаниями, вот пример производительности делать это так, как Анализировать хочет, чтобы вы это сделать. Как и прежде, производительность по-прежнему оставляет желать лучшего по сравнению с coredata. Пример кода:
PFQuery *query = [PFQuery queryWithClassName:LOCATION_OBJECT];
[query fromLocalDatastore];
[query whereKey:MESSAGE_TO_FIELD equalTo:user.username];
[query orderByDescending:CREATED_FIELD];
NSLog(@"Query started ... ");
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
NSLog(@"Query finished ... ");
if(!error)
NSLog(@"Found %lu message records in local datastore", (unsigned long)[objects count]);
else
NSLog(@"Parse error pulling messages from datastore: %@ %@", error, [error userInfo]);
}];
Производительность в одном IPAD:
2015-06-30 10:32:09.633 MvBii[205:5172] Query started ...
2015-06-30 10:32:09.948 MvBii[205:5172] Query finished ...
2015-06-30 10:32:09.948 MvBii[205:5172] Found 100 message records in local datastore
Запрос занимает 0,315 секунд. Теперь, как и прежде, я не говорю, что это плохо по-своему, и, вероятно, для многих приложений это просто отлично, но на порядок хуже, чем coredata, и слишком медленно для моего приложения. Поскольку пользователь перемещается по экрану, графика выводится в результате этого запроса, и я не могу быстро обновить экран, используя синтаксический анализ, в ответ на ввод пользователя. Результаты очень хорошие.
Мой главный вопрос: просто ли это время запроса соответствует чужому опыту? Интересно, есть ли что-то особенное для моего приложения или набора данных? Набор данных невелик (< 200 элементов), объект синтаксического анализа - это просто строки и ints. Я все еще очень хочу использовать Parse для всех других объектов, которые он предоставляет. Возможно, это просто мои ожидания отключены, но, похоже, для основного запроса долгое время.
его не вопрос конца синтаксического анализа, его проблема конца конца. В предупреждении четко указано, что вы должны изменить (долгосрочная задача в основном потоке), другими словами, обновления, которые вы делаете для таблицы или любые изменения интерфейса, должны выполняться в основном потоке, все остальные асинхронные вызовы не должны быть. Выполните запрос в фоновом режиме и обновите результаты в представлении основного потока. – soulshined
Спасибо за ваш комментарий. В самом приложении я выдвигаю все задачи на задний план. Конечно, с точки зрения производительности это делает вещи еще медленнее. Суть моей заботы - время, необходимое для выполнения запроса - согласно моему примеру. В моем приложении экран анимируется по ходу навигации пользователя, анимация оставляет желать лучшего, поскольку результаты запроса занимают слишком много времени. Как пользователь Parse у вас есть информация о времени запроса для локального хранилища данных? В частности, по сравнению с кровью? – pyrrhoofcam
Вы не выполняете запрос в фоновом потоке, как я уже говорил выше. Вместо использования 'findObjects' используйте [findObjectsInBackgroudWithBlock] (https://parse.com/docs/ios/api/Classes/PFQuery.html#//api/name/findObjectsInBackgroundWithBlock :), тогда, когда вы заполняете представление таблицы массивом убедитесь, что вы делаете эту часть основного потока. Много учебников там или даже на SO для этого. – soulshined