Форум программистов, компьютерный форум CyberForum.ru

Оцените решение (CollectionView - add/delete) - Программирование iOS/iPhone

Восстановить пароль Регистрация
 
kievkao
42 / 42 / 2
Регистрация: 22.11.2012
Сообщений: 225
30.09.2013, 17:41     Оцените решение (CollectionView - add/delete) #1
Добрый день!
Решаю такую, вроде как очень распространенную задачу:
Есть CollectionView, в который при прокрутке, если закончились данные, динамически подгружаются новые. Бесконечно добавлять в память данные нельзя, поэтому я для себя определил буфер в x-элементов, которые одновременно могут находиться в памяти. Если при добавлении мы превышаем это допустимое кол-во - с обратной стороны (где начало скролла) элементы "отваливаются" и выгружаются из памяти.

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

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

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

Как из collectionView получить IQuerable из CollectionView? C# WPF
C++ Оцените решение задачи
Rate my app - оцените мое приложение Objective-C
C++ Builder ValueListEditor: Add & Delete
Написать аналог процедуры Delete. Процедурой Delete и функцией Copy не пользоваться Pascal ABC
Objective-C Изменение TextField в CollectionView с использованием биндов
CollectionView не отображает subviews в ячейках Objective-C
Решение задач! Swift
Куда направлять пользователя в "Оцените нас", если до релиза не известна ссылка на приложение?
JavaScript Почему git add . и git add * это плохо? И как тогда быть?
Недоступны кнопки "Add new" и "Delete" в BindingSource Visual Basic .NET
CollectionView & Segue Swift

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

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

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

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

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

Текущее время: 09:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru