2013-03-07 2 views
1

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

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

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

+1

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

+0

@rmaddy Я бы сказал, что если вы ответили. ;) –

+0

@JacobRelkin Done. – rmaddy

ответ

1

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

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

+0

Инженеры Apple любят называть это парадигмой «ящик в коробке». Вы создаете новый «ящик» или очередь, которая содержит ваш тяжелый подъем. Затем вы переходите из указанной выше очереди в основную очередь для обновления пользовательского интерфейса. Это очень распространенная практика. –

0

Вы можете использовать GCD, Raywenderlich Tutorial

- (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; 
    }); 
}