отображать текст во время IBAction в target-c - PullRequest
1 голос
/ 23 марта 2012

У меня есть код, показанный ниже:

- (IBAction)startButtonPressed:(id)sender {
    statusText.text = @"Processing...";

    //here I do a bunch of calculations

    //display calculated data
    statusText.text = [[NSString alloc] initWithFormat:@"coefficient: %.4f",
         [[coefficientEstimatesR objectAtIndex:0] doubleValue]];
}

Расчеты, которые я делаю, занимают около 17 секунд, поэтому я хотел бы отобразить слово «обработка», пока это делается. Однако, когда я запускаю это, «обработка» никогда не отображается, отображаются только рассчитанные данные.

Буду признателен за любые идеи о том, как это сделать. Спасибо!

Ответы [ 2 ]

4 голосов
/ 23 марта 2012

Не выполняйте никакой обработки в потоке графического интерфейса пользователя, если это занимает одну секунду, особенно если это занимает 17 секунд Использование GCD делает разгрузку задачи тривиальной:

- (IBAction)startButtonPressed:(id)sender {
    statusText.text = @"Processing...";

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        //here I do a bunch of calculations

        dispatch_async(dispatch_get_main_queue(), ^{
            //display calculated data
            statusText.text = [[NSString alloc] initWithFormat:@"coefficient: %.4f",
                               [[coefficientEstimatesR objectAtIndex:0] doubleValue]];
        });
    });
}
1 голос
/ 23 марта 2012

Однако, когда я запускаю это, «обработка» никогда не отображается, только расчетные данные отображаются.

Это потому, что рисование происходит в главном потоке. Если вы связываете основной поток, выполняя вычисления, вы блокируете все остальное, что должно происходить, включая отрисовку текста состояния.

Вместо этого установите текст своего статуса, запустите фоновый поток (или отправьте блок в очередь и т. Д.) И вернитесь из метода действия как можно быстрее. По завершении вычисления фоновый поток (или блок) вызовет метод основного потока, чтобы вы могли снова изменить текст статуса.

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