2013-11-15 5 views
0

У меня есть относительно быстрое приложение SproutCore, которое я пытаюсь сделать чуть чуть быстрее.Как предварительно загрузить элементы в ListView SproutCore?

Прямо сейчас, когда пользователь прокручивает мой SC.ListView, и они просматривают некоторые элементы списка, которые не были загружены с сервера (скажем, из отношения), приложение автоматически делает вызов на сервер для загрузки этих записей. Несмотря на то, что это быстро, все же есть короткий период времени, когда мои элементы списка пустые.

Я знаю, что могу заставить их сказать «Загрузка ...» или что-то в этом роде (и у меня есть), но мне было интересно: был способ предварительной загрузки моих «заставных» записей так что, когда пользователь прокручивает, элементы списка уже загружены?

My ListItemViews будет довольно большим (по пикселям), поэтому даже загрузка двойного количества данных не будет убийцей с точки зрения AJAX, и было бы неплохо, если бы пользователь прокрутил, содержимое было всегда загружаются (если они не прокручивают SUPER-SUPER-fast, и в этом случае у меня все в порядке, если они видят индикатор загрузки).

В настоящее время я нашел решение, добавив следующее в свой SC.ListView, но я заметил некоторые важные проблемы с производительностью на мобильных устройствах, и они напрямую связаны с внесением этого изменения, поэтому мне было интересно, есть ли лучший способ ,

contentIndexesInRect: function(rect) { 

     rect.height = rect.height * 2; 

     return sc_super(); 

    } 

ответ

1

Переопределение содержимогоIndexesInRect - это то, как я это сделал. Я бы сделал меньше, чем удвоил его - я мог бы получить результат от sc_super(), а затем добавить несколько дополнительных элементов в результирующий набор индексов. (Я считаю, что он застыл, поэтому вам придется клонировать-редактировать-замораживать.) Один или два дополнительных могут дать вам достаточно комнату для передышки, чтобы загрузить материал, не внося существенного вклада в очевидную проблему с производительностью.

Я удивлен, что это приводит к серьезным проблемам с производительностью. Мне кажется, что сами элементы списка могут быть тяжелее, чем они должны быть - например, у них может быть много привязок, чтобы зацепить и отцепить. Если это то, что происходит, вы можете больше выиграть от повышения их эффективности.

+0

Это фактически работает в тесте «test», где метод «render()» выдает некоторый базовый HTML, который предоставляется в объекте JSON (в основном просто div с некоторым текстом). Они определенно не являются «тяжелыми» видами позиций. На мобильном устройстве я могу использовать '* 1.05' без существенной проблемы, но все, что похоже на' * 1.1' или выше, приводит к замедлению. –

+0

Попробуйте перейти к маршруту обезьяны-с-sc_super() и просто добавить один или два фактических элемента? (Это легко.) Посмотрите, какой порог вызывает проблемы? Также вы на 1.10? – Dave

+0

Это действительно 1.10, и только 1-2 элемента не будут отображать какие-либо проблемы, так как это проблема с прокруткой (вы не можете прокручивать всего несколько элементов). Я отлаживаю еще немного и вижу, есть ли какие-то конкретные проблемы, которые я могу вывести. –

0

Я думаю, вам будет лучше послушать, чтобы загрузить дополнительные данные за пределами контекста того, что отображается на самом деле. Например, для форматирования большего количества элементов списка для запуска дополнительных запросов делает результатом наличия дополнительных данных, но также добавляет несколько ненужных элементов в DOM, что наносит ущерб общей производительности. Фактически эти дополнительные элементы, скорее всего, являются причиной серьезного спада на мобильных устройствах, когда вы доберетесь до достаточного количества дополнительных услуг.

Вместо этого я должен убедиться, что ваши элементы списка элементов правильно объединены, так что только видимые элементы обновляют на месте с минимальным количеством манипуляций с DOM. Затем во-вторых, я лениво загружаю дополнительные данные только после запроса требуемых данных. Существует несколько способов сделать это в зависимости от вашей настройки. Возможно, вы захотите добавить некоторую логику к источнику данных, чтобы вызвать дополнительный запрос в каждом заполненном диапазоне запросов, или вы можете сделать что-то вроде переопределения itemViewForContentIndex в SC.CollectionView в качестве точки для запуска дополнительных данных. В любом случае, я думаю, это может выглядеть примерно так,

// … 

prefetchTriggered: function (lastIndex) { 

    // A query that will fetch more data (this depends totally on your setup). 
    var query = SC.Query.remote(MyApp.Record, { 
    // Parameters to pass to the data source so it knows what to request. 
    lastIndex: lastIndex 
    }); 

    // Run the query. 
    MyApp.store.find(query); 
}, 

// … 

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

+0

Я думаю, что попробую маршрут itemViewForContentIndex. Предполагая, что я использую 'SparseArray', могу ли я просто предоставить больше данных' обеспечиватьObjectsInRange' или ожидает ли только диапазон, который был запрошен? –

Смежные вопросы