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

Программирование iOS/iPhone

Войти
Регистрация
Восстановить пароль
 
kievkao
42 / 42 / 2
Регистрация: 22.11.2012
Сообщений: 225
#1

Торможение UI при хитрой иерархии классов - Программирование iOS

27.03.2014, 22:40. Просмотров 540. Ответов 5
Метки нет (Все метки)

Всем привет!

Извините за много букв, заранее спасибо всем, кто прочитал!

Подскажите, пожалуйста, что может быть причиной такого поведения.
Есть контроллер, на нем, в частности, 20 кнопок:
Первые 10 кнопок: background - изображение, title - буква (вроде маленького алфавита)
Вторые 10 кнопок: background - изображение, title - пустой (ячейки, куда будут выводиться буквы)

Чтобы не мешать все в кучу в одном контроллере, я решил сделать так:
1. Создал класс "CharsManager", который полностью отвечает за работу с "алфавитом". При создании объекта этого класса я инициализирую его массивом кнопок с буквами:

Objective-C
1
2
NSArray *baseCharsButtons = @[self.char_1, self.char_2, self.char_3, self.char_4, self.char_5, self.char_6, self.char_7, self.char_8, self.char_9, self.char_10];
charsManager = [[BaseCharsManager alloc] initWithCharsButtons:baseCharsButtons andDelegate:wordManager];
И каждой кнопке присваиваю внутри класса CharsManager обработчик нажатия.

2. Создал класс "WordManager", который полностью отвечает за отображение вводимого слова. Его при создании аналогично проинициализировал массивом кнопок-ячеек, куда выводятся вводимые буквы. И, как можно увидеть, сделал его делегатом своего "класса клавиатуры".

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

3. Создал кнопку "Очистить все", где выполняю следующие действия:
Objective-C
1
[wordManager clearAll];
Где метод <clearAll> являет собой следующее:
Objective-C
1
2
3
4
5
6
7
8
9
10
- (void)clearAll
{
    for (int i = 0; i < [self.charsBut count]; i++) {
        UIButton *but = [self.charsBut objectAtIndex:i];
        [but setTitle:@"" forState:UIControlStateNormal];
    }
    
    [word setString:@""];    // в word хранится текущее введенное слово
    currentIndex = 0;         // индекс текущей введенной буквы
}
//--------------------------------------------------
Для чего я собственно, это все пишу.
После первого же нажатия "Очистить все" начинаются тормоза UI: девайс (iPad 4) с задержкой реагирует на нажатия кнопок алфавита, и выводит буквы в свои ячейки с видимой паузой.
И такое начинает происходить после первого "Очистить все".

Я пересмотрел работу всеми профайлерами - все ОК, память бесконтрольно не растет, утечек нет, ничего на графиках профайлера не меняется после нажатия "Очистить все", но факт остается фактом.

Может быть мой подход в корне неправильный? И та структура, которую я соорудил, является чем-то ужасным, что может негативно влиять на работу?

Буду очень рад каким-то комментариям!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2014, 22:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Торможение UI при хитрой иерархии классов (Программирование iOS):

Виртуальные функции при создании иерархии классов - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class var{ int temperatura; float shirina; public: virtual...

Почему при создании класса у абстракных классов по иерархии пусто в _vptr ? - C++
Вот что я имею ввиду:

Разработать архитектуру классов иерархии товаров при разработки системы управления потоков товаров - C#
Уважаемое IT сообщество подскажите пожалуйста в каком направлении лучше двигаться в решении следующей задачи. Задача. Разработать...

Разработать архитектуру классов иерархии товаров при разработке системы управления потоками товаров - C#
Разработать архитектуру классов иерархии товаров при разработке системы управления потоками товаров для дистрибьюторской компании. ...

Создание иерархии классов - C#
Создать следующую иерархию классов: Класс CL1 содержит в себе: -Элементы-данные доступные в CL2, но не доступные в CL3 -Класс...

Цепочка иерархии классов - C++
Какой доступ будет в цепочке protected - public - protected? ...

5
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
28.03.2014, 02:34 #2
ну из того, что я понял, ничего хитрого тут нету и, судя по коду, ничего сказать нельзя, т.к. вроде все нормально
возможно нужно увидеть больше деталей

единственное - это пару советов по архитектуре и конвенциям наименования (но они темы особо не касаются):
Цитата Сообщение от kievkao Посмотреть сообщение
initWithCharsButtons:baseCharsButtons andDelegate:wordManager
в названии метода редко используют 'and', только тогда, когда то, что последует за ним будет отличаться от других параметров по семантике действия или назначения
т.е ваш метод должен выглядеть так
Objective-C
1
initWithCharsButtons:baseCharsButtons delegate:wordManager
а 'and' можно было бы встретить например тут
Objective-C
1
initWithCharsButtons:baseCharsButtons delegate:wordManager andPerfomSomething:YES
Дальше менеджер, который работает напрямую с кнопками. Я считаю, что менеджер должен работать с данными, а не графическими элементами, а вот контролер - наоборот. Т.е было бы лучше передавать менеджеру не кнопки, а датасорсы этих кнопок, и его можно было бы применить к примеру на другой платформе (Mac OS) или для работы с кастомными кнопками, которые наследуются от UIView к примеру, вобщем суть в том, чтобы сделать код reusable, а вот контроллер пусть уже набивает кнопки этими датасорсами (не обязательно вьюконтроллер в котором все происходит, можно для этого создать отдельный)
многие могут не согласиться насчет этих замечаний, и, возможно, такая гибкость тут ни к чему, но если вы разрабатываете какой-то более-менее адекватный проект, то это лучше учитывать
1
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
28.03.2014, 07:40 #3
Цитата Сообщение от kievkao Посмотреть сообщение
Я пересмотрел работу всеми профайлерами - все ОК, память бесконтрольно не растет, утечек нет, ничего на графиках профайлера не меняется после нажатия "Очистить все", но факт остается фактом.
Что ОК то? При чем тут утечки памяти вообще? Тайм профайлером смотрели? На что время тратиться при тормозах?
1
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
28.03.2014, 11:32 #4
kievkao, начните с того, где у вас происходит обработка нажатия на "букву", затем по стеку вверх идите инструментами "step over/into" и смотрите вызовы.
Где-то много лишних вызовов. И все в главном потоке. Возможно создание объектов/итерирования для поиска/сортировки...
1
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
28.03.2014, 12:18 #5
+1 за Time Profiler - все покажет и расскажет, и не надо гадать )
1
kievkao
42 / 42 / 2
Регистрация: 22.11.2012
Сообщений: 225
28.03.2014, 15:46  [ТС] #6
Спасибо всем за ответы!

Начал ковырять глубже Time Profiler'ом, увидел, что относительно много времени тратится на отрисовку фона ячейки, куда выводится буква.
Поигрался с кнопкой, которая представляет собой ячейку, изменил тип кнопки с "System" на "Custom" и все стало хорошо))

Сейчас буду читать, почему этот параметр сыграл настолько большую роль..

Добавлено через 1 минуту
Цитата Сообщение от Vorona Посмотреть сообщение
Дальше менеджер, который работает напрямую с кнопками. Я считаю, что менеджер должен работать с данными, а не графическими элементами, а вот контролер - наоборот. Т.е было бы лучше передавать менеджеру не кнопки, а датасорсы этих кнопок

Что вы имеете в виду под датасорсами кнопок?
Я решил передавать своему менеджеру именно экземпляры UIButton, так как установка title для кнопки производится путем [button setTitle:forState:], где необходим доступ к самому объекту.

Если есть другой метод, то расскажите вкратце, пожалуйста, буду вам благодарен!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2014, 15:46
Привет! Вот еще темы с ответами:

Отображение иерархии классов - Java SE
Посоветуйте, пожалуйста прогу для отображения java-классов в виде диаграммы. (ничего не нагуглил, но у меня когда-то был диск с прогами для...

Построение иерархии классов - C#
1) Разработать методы (не менее 3-х) и свойства (не менее 3-х) для каждого из определяемых классов. 2) Один из методов в классе родителе...

Создание иерархии классов - Delphi
Создать иерархию классов. воздушный шар--дирижабль--самолет Характеристики шара: скорость движения, направление движения (угол 0..359...

Построение иерархии классов - C#
а есть ли так сказать, блок схема, между тем, как работает программа? Точнее от класса к методу и тд, как все это выглядит? на примере...


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

Или воспользуйтесь поиском по форуму:
6
Yandex
Объявления
28.03.2014, 15:46
Ответ Создать тему
Опции темы

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