2011-03-04 5 views
1

В приложении iPad у меня есть куча UIImageViews внутри большего UIView. Каждый UIImageView содержит миниатюру, которая создается в отдельном потоке (чтобы не замораживать приложение). После того, как эскиз был успешно сгенерирован, я вызываю setNeedsDisplay в основном потоке, однако он не обновляет UIImageViews по мере того, как большие пальцы становятся доступными (я вижу их в журнале), а занимает около 5 секунд, а затем отображает их все в один раз.UIView занимает слишком много времени, чтобы обновить

вот что я делаю, когда эскиз был создан в отдельном потоке:

[self performSelectorOnMainThread:@selector(setNeedsDisplay) 
         withObject:nil 
        waitUntilDone:NO]; 

какие-нибудь идеи?

ответ

0

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

+0

no, мой основной поток позволяет пользователю взаимодействовать с представлениями (перетаскивать их, упорядочивать и т. Д.). Так что он не останавливается. Именно по этой причине я использую отдельный поток для загрузки эскизов, чтобы пользовательский интерфейс не выглядел отрывистым. Я использую NSOperationQueue для потоковой обработки, и мои журналы показывают, что потоки примерно занимают около 200 мс, чтобы закончить работу. но эскизы появляются только через 5 секунд. –

+1

Я знаю, что вы сказали, что вы вызываете 'setNeedsDisplay' в свой основной поток, но вы вообще взаимодействуете с UIKit * * из фонового потока? – Jim

+0

нет, нет. Я просто читаю исходные изображения, изменяя их размер и устанавливая их на UIIImageView, о, подождите, я не могу установить их в UIImageView, могу ли я? упс. это была глупая ошибка. я смущен. спасибо Джим. проблема исправлена. –

0

Проблема в том, что вы не можете сказать какао, что он должен перерисовать «сейчас». С setNeedsDisplay вы можете запросить перерисовать, так как рисунок является довольно дорогим продуктом.

setNeedsDisplay

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

Mybe это лучшее и более эффективное решение для ожидания всех сгенерированных значков ?!

+0

, когда я перетаскиваю UIImageViews, не следует их перерисовывать. я не могу понять, почему это занимает много времени, прежде чем они начнут показывать эскизы. –

0

Я бы использовал NSNotification. Отправляйте уведомление из своей темы, загружая изображения, когда изображение будет готово. Контроллер просмотра может наблюдать за этими уведомлениями и обновлять представление по мере их поступления.

Смежные вопросы