как отправка сообщения в класс работает в target-c - PullRequest
1 голос
/ 06 октября 2010

Я пытаюсь выяснить, как вызовы методов работают в target-c.

У меня есть простая строка кода в приложении для iPhone, которая изменяет внешний вид представления, а затем вызывается контроллер представления и подключается к основному виду.

switch(pressed) {

   case overall: {
      IPViewController *ipv = [[IPViewController alloc] initWithParam:(IPParam*)p]; 
      [self.view addSubview: ipv.view];
      [ipCustomTabbar switchOn:YES]; // <-- here at first attempt
   }
}

Бывает, что выделение ipv занимает довольно много времени, поэтому внешний вид ipCustomTabbar через некоторое время меняется. Поэтому я решил сначала переместить ipCustomTabbar. Но с удивлением обнаружил, что это поведение совсем не изменилось. Панель ipCustomTabbar не изменяется до тех пор, пока ipv не будет инициализирован и прикреплен к просмотру. Я ожидал, что первым делом был вызов / сообщение на switchOn, а затем выполнить остальную часть потока.

switch(pressed) {

   case overall: {
      [ipCustomTabbar switchOn:YES]; // <-- moved here 
      IPViewController *ipv = [[IPViewController alloc] initWithParam:(IPParam*)p]; 
      [self.view addSubview: ipv.view];
   }
}

EDIT: если я закомментирую «трудоемкие» строки, все будет довольно быстро.

switch(pressed) {

   case overall: {
      [ipCustomTabbar switchOn:YES]; // <-- only this is fast 
      //IPViewController *ipv = [[IPViewController alloc] initWithParam:(IPParam*)p]; 
      //[self.view addSubview: ipv.view];
   }
}

Что мне здесь не хватает?

спасибо

1 Ответ

2 голосов
/ 06 октября 2010

Правильно ли я считаю, что [ipCustomTabbar switchOn:YES] меняет внешний вид представления, и вы хотите, чтобы это произошло сразу, вместо того, чтобы ждать завершения обработки в -initWithParam:.

Проблема в способе обработки чертежа. Изменение состояния объекта просмотра не обязательно приводит к тому, что рисование выполняется сразу. Обычно происходит то, что изменение состояния представления делает его недействительным и помещает его в список объектов Cocoa, которые необходимо перерисовать. Настоящий; рисование происходит только позже, и поскольку оно происходит в основном потоке, это будет после завершения обработки вашего события, включая инициализацию вашего контроллера представления.

Что вам нужно сделать, так это избегать как можно более длительной обработки основного потока. Вы должны рассмотреть возможность перемещения длительной обработки в методе -initWithParam: в другой поток. Похоже, это идеальный кандидат для NSOperation .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...