Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование iOS/iPhone
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
kievkao
42 / 42 / 2
Регистрация: 22.11.2012
Сообщений: 225
1

Оцените решение (CollectionView - add/delete)

30.09.2013, 17:41. Просмотров 853. Ответов 4
Метки нет (Все метки)

Добрый день!
Решаю такую, вроде как очень распространенную задачу:
Есть CollectionView, в который при прокрутке, если закончились данные, динамически подгружаются новые. Бесконечно добавлять в память данные нельзя, поэтому я для себя определил буфер в x-элементов, которые одновременно могут находиться в памяти. Если при добавлении мы превышаем это допустимое кол-во - с обратной стороны (где начало скролла) элементы "отваливаются" и выгружаются из памяти.

Столкнулся с некрасивой штукой: когда я удаляю n-элементов в начале и добавляю n-элементов в конце, делая после этого
Objective-C
1
[_collection reloadData];
, то, понятное дело, автоматически смещаюсь в конец добавленных данных, на последний элемент.
Захотелось от этого избавиться - чтобы данные добавлялись/удалялись "молча", и пользователь находился в том же месте скролла, где он был до выполнения этой операции.

Пока родился вариант (работающий), который мне очень не нравится, т.к. отдает жестоким говнокодом:
Objective-C
1
2
3
[_collection reloadData];
...
[_collection setContentOffset:offset];
Короче, высчитываю, сколько добавлено ячеек, какой их суммарный визуальный размер + расстояния между ячейками, и смещаюсь на эту величину. В итоге скролл, как мне и надо, стоит на одном месте.

Но что мне подсказывает, что есть нормальная реализация такого механизма.. Прочитал много разных источников - но не могу ничего такого интересного найти..
Буду благодарен рекомендациям!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2013, 17:41
Ответы с готовыми решениями:

CollectionView & Segue
Помогите плиз, голову уже сломал, весь нет перерыл - не могу понять что да как....

CollectionView не отображает subviews в ячейках
Выводит пустые ячейки, какие бы view я в них не добавлял, вроде делаю все...

Изменение TextField в CollectionView с использованием биндов
Помогите пожалуйста разобраться с некоторыми полями в Binding Inspector! ...

Как из collectionView получить IQuerable из CollectionView?
Доброго времени суток! В DataGrid на форме: ItemsSource = "{Binding...

ValueListEditor: Add & Delete
Выпадает ошибка. Подскажите, пожалуйста, как побороть. Спасибо! void...

4
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
30.09.2013, 18:31 2
А зачем уменьшать значение collectionView:numberOfItemsInSection:?
Поясню. К примеру, есть массив, из которого берутся данные. Предположим их там X. Грузим след. страницу - еще Y элементов. Выкашиваем из масива первые Z. Тут возможны варианты. Я бы заменял их на [NSNULL null]. Вы, по всей видимости, их просто выносите из массива. В любом случае numberOfItemsInSection должно возвращать X+Y. Только в вашем случае очередной элемент массива для настройки очередного села должени искаться по формуле X-Z.
Надеюсь, более или менее понятно изложил

Только мне сама постановка задачи не нравится. При правильной организации данных - это такие копейки...
1
kievkao
42 / 42 / 2
Регистрация: 22.11.2012
Сообщений: 225
30.09.2013, 19:37  [ТС] 3
Спасибо, попробую сделать так!

Постановка задачи вызвана необходимостью допилить проект предыдущего разработчика, в котором выполняется загрузка новостей при скроллинге . Просмотрев Instruments'ом, что там происходит с выделением памяти - увидел, что при таком скроллинге с подгрузкой она забивается страшными темпами (проект огромный и без единого комментария).
Выбрал для решения проблемы описанный в моем посте метод, как самый простой.

Добавлено через 45 минут
mobidevelop, вдвойне вам спасибо: посмотрел на выделение памяти с использованием вашей рекомендации, потом с использованием моей на реальном проекте - выигрыш мизерный. Так что память течет где-то совершенно в другом месте..
0
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
30.09.2013, 19:39 4
Проверьте какие объекты больше всего памяти съедают. Подозреваю, что это картинки.
0
kievkao
42 / 42 / 2
Регистрация: 22.11.2012
Сообщений: 225
30.09.2013, 19:42  [ТС] 5
Именно))
А конкретно - это категория с меткой "VM: ImageIO_JPEG_Data".
Походив по проекту, вижу, что все кладется и берется из БД, так что, вроде как, на первый взгляд, в оперативку много мусора не должно ложиться..
Буду сейчас поглубже копать..
0
30.09.2013, 19:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2013, 19:42

How can i add delete button to oracle apex?
i want to add delete button to apex for delete all rows and colums. How can i...

Недоступны кнопки "Add new" и "Delete" в BindingSource
Недоступны кнопки "Add new" и "Delete" в BindingSource. Что делать?

Оцените решение задачи
Наткнулся тут на задание по программированию, от нечего делать решил его...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru