Обновление индикатора выполнения при создании печатной страницы

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

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

Я новичок в многопоточности; есть ли у меня другие варианты или я должен использовать индикатор активности или что-то подобное?


person Josh Sherick    schedule 07.03.2013    source источник
comment
Создание изображений в фоновом потоке должно быть безопасным. Оставьте обновления индикатора выполнения в основном потоке.   -  person rmaddy    schedule 08.03.2013
comment
@rmaddy Я бы проголосовал за это, если бы вы ответили. ;)   -  person Jacob Relkin    schedule 08.03.2013


Ответы (2)


Обновите свой код, чтобы создание изображения выполнялось в фоновом потоке. Это должно быть безопасно.

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

person rmaddy    schedule 08.03.2013
comment
Инженеры Apple любят называть это парадигмой «коробка внутри коробки». Вы создаете новую коробку или очередь, которая содержит вашу тяжелую работу. Затем вы переходите из вышеупомянутой очереди в основную очередь для обновления пользовательского интерфейса. Это очень распространенная практика. - person Jacob Relkin; 08.03.2013

Вы можете использовать GCD, Руководство по Raywenderlich

- (void)generatePage
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
        /*
          Here you can generate page and update progress
          For example:
         */
        [self updateProgress:10.0f];
        sleep(1000);
        [self updateProgress:20.0f];
        sleep(3000);
        [self updateProgress:100.0f];
    });
}

- (void)updateProgress:(float)progress
{
    dispatch_async(dispatch_get_main_queue(), ^{
        progressView.progress = progress;
    });
}
person Sergey Kuryanov    schedule 08.03.2013