Как добавить спиннер в представление перед выполнением сложной вычислительной задачи - PullRequest
0 голосов
/ 02 марта 2010

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

Так, как я могу сделать этот вращающийся дисплей перед переходом к следующему виду? Заранее спасибо!

- (void)
    tableView: (UITableView *) tableView
    didSelectRowAtIndexPath: (NSIndexPath *) indexPath {

    UITableViewCell *cell = [ self.tableView cellForRowAtIndexPath: indexPath ];

    if (cell.accessoryType == UITableViewCellAccessoryDisclosureIndicator) {
        UIActivityIndicatorView *activityIndicator = [ [ UIActivityIndicatorView alloc ] initWithFrame: CGRectMake(260.0, 10.0, 25.0, 25.0) ];
        activityIndicator.hidesWhenStopped = YES;
        activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;

        [ cell addSubview: activityIndicator ];
        [ activityIndicator startAnimating ];

        TableDemoViewController *newViewController = [ [ TableDemoViewController alloc ] initWithPath: cell.textLabel.text ];
        UINavigationController *navigationController = [ appDelegate navigationController ];
        [ navigationController pushViewController: newViewController animated: YES ];
        [ activityIndicator stopAnimating ];
    }
}

1 Ответ

1 голос
/ 02 марта 2010

Если простая инициализация TableDemoViewController - это то, что так интенсивно, у вас есть другие проблемы. Помните, что основной поток является синхронным, как вы указали. У вас есть пара вариантов:

  • Вполне возможно, что простое вращение цикла выполнения после добавления счетчика решит вашу проблему. Вы можете сделать это, разделив ваш метод на две части и вызвав вторую часть с инициализацией TableDemoViewController из performSelector:withObject:afterDelay: с задержкой 0.
  • Вы, вероятно, хотите выяснить, почему init так дорог, и убрать это из основного потока. Я настоятельно рекомендую узнать, как использовать NSOperations и NSOperationQueue. Вы можете использовать шаблон делегата или NSNotificatin, чтобы сообщить вызывающим абонентам, когда ваша дорогая операция выполнена.

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

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