iOS устанавливает значение индикатора выполнения во время обработки изображений

У меня есть приложение, обрабатывающее пару изображений с помощью Quartz, и я хотел иметь UIProgressView, который изменяется после каждого действия. (например, 0,0 0,2 0,4 0,6 0,8 1,0)

Проблема в том, что, похоже, пока мое изображение обрабатывается, пользовательский интерфейс полностью заблокирован, а значение изменяется только после того, как весь процесс завершен (это означает, что оно просто достигает 1.0 без прохождения подэтапов),

Кто-нибудь из вас когда-нибудь сталкивался с этим?

Псевдо:

for(uint i=0;i<5;i++){
    // Execute some Quartz based action here, such as CGContextDrawTiledImage etc...
    myProgress.progress = (i+1) * 0.2;          
}

Таким образом, на самом деле вместо того, чтобы индикатор выполнения изменялся после каждого действия, он изменяется только один раз в конце на 1.0. Был бы признателен за ваш отзыв или опыт или это.

Спасибо
Шай.


person Shai Mishali    schedule 02.09.2011    source источник


Ответы (1)


Вам нужно будет обновить либо свои активы, либо индикатор выполнения в отдельном потоке, чтобы они могли обновляться параллельно.

Взгляните на [NSThread detachNewThreadSelector:selector toTarget:target withObject:object];

Сделайте свой прогресс переменной-членом

 [NSThread detachNewThreadSelector:@selector(updateFilterProgress) toTarget:self withObject:nil];

 prgLoader.progress = x;


- (void) updateFilterProgress{

    NSAutoreleasePool *pool = [NSAutoreleasePool new];

    while ([prgLoader.progress floatValue] < 1.0f)    //Keep this thread alive till done loading. You might want to include a way to escape (a BOOL flag)
    {
        GTMLoggerInfo(@"Updating progress to %f", [progress floatValue]);
        prgLoader.progress = [progress floatValue];
    }
    [pool release];

}
person James Webster    schedule 02.09.2011
comment
Просто для уверенности, скажем, я помещаю строку myProgress.progress в другой селектор и выполняю ее в другом потоке? Это то, что вы предлагаете? Я попробую :) звучит хорошо. - person Shai Mishali; 02.09.2011
comment
Эй, я безуспешно пробовал следующее, я что-то делаю не так? Также прикреплен журнал: pastebin.com/GfCqmq1s - person Shai Mishali; 02.09.2011
comment
Неважно, только что добавлен NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; и это устранило проблему :) - person Shai Mishali; 02.09.2011
comment
О, понятно, так что лучше иметь один поток один раз и убить его в конце вместо того, чтобы запускать и убивать поток для каждого обновления ... имеет смысл :) - person Shai Mishali; 02.09.2011
comment
Не обязательно, я бы так и поступил. Это, конечно, может быть не лучшим вариантом, и могут возникнуть проблемы с потоками. Рассмотрите возможность добавления к нему с помощью @synchronized или других методов, чтобы сделать его потокобезопасным. - person James Webster; 02.09.2011
comment
Я не совсем уверен, что такое @synchronized, возможно, я смогу прочитать какую-нибудь ссылку? Очень признателен :) - person Shai Mishali; 02.09.2011
comment
Это первое, что я нашел: softpixel.com/~cwright/programming/threads /threads.cocoa.php Ваши ключевые слова: многопоточность, синхронизация, мьютекс, потокобезопасность и т. д., если вы хотите искать самостоятельно - person James Webster; 02.09.2011